概述
鼠标客制化
目的:在应用层,进入特定的应用显示自己的指定的鼠标icon,或者随时切换鼠标icon。
实现方案:开机预加载鼠标icon,app发送广播方式通过不同的index,show出不同的icon。
Android系统鼠标流程原理:
系统开机底层会调用java的一个方法getPointerIcon去加载java层的icon资源,然后画到最顶层的surface上面,开启只执行一次。所以要随时更换鼠标图片需要打通一条路让java层调用初始化鼠标icon的方法。鼠标的一切资源都是有java层,frameworks/base/core/res/res 里面提供。包括鼠标icon,鼠标focus等。
客制化过程:
1.资源配置:
1.添加icon 对应xml 文件:frameworks/base/core/res/res
在这个文件夹的对应drawable-mdpi drawable-hdpi drawable-xdpi中,
放进准备好的鼠标图片资源pointer_orbbec_arrow.png
系统默认文件如下:
增加完自己准备的图片和xml(xml直接复制就可以)
Xml文件里的内容也要修改:
原本:
添加的xml:
三个drawable分别这么修改。
1.修改frameworks/base/core/res/res/values下的文件
Styles.xml中添加一个我们自己的icon item
添加的ICON 名字是 pointerOrbbecIconArrow
Java代码中会根据这个名字来寻找图片资源,所以一定要准确。
Attrs.xml文件 添加刚才的icon
到这里icon资源配置修改完毕。
2.代码修改:
1.修改JNI层代码:
frameworks/base/services/jni/com_android_server_input_InputManagerService.cpp
函数:obtainPointerController
主要是添加一个if分之对controller非空的处理,这个时候要注意要用系统原先的mouse controller 故注释掉new语句。原来的if句稍作修改:
这里修改了Android原生的方法getPointerIcon的参数,也就是加了一个整型参数,对应的JNI层函数声明和注册java method都要留意修改,JAVA层的接口也要对应修改。
下面是加了一if分之,因为开机第一次controller是NULL,肯定进了第一个if句,后面controller非NULL,所以想换icon就是进入下面这个if分之了:
JAVA层通过渠道会调用到这个方法,这里为了不破坏这个方法的参数结构,重新声明定义了一个native函数,java层通过app不同的cmd而向JNI层下达对应cmd以show出不同的icon,具体如下:
这边修改了JNI 会掉java方法的参数 getPointerIcon(),使其有个整型参数,用于区别不同的icon index。还添加了函数nativeOrbbecNotify(),所以
在这个文件的注册java method的地方也要修改:
在函数:
int register_android_server_InputManager(JNIEnv* env) {
在
static JNINativeMethod gInputManagerMethods[] = {
JNI的修改到此为止。
2.java 层的修改
Frameworks/base/services/java/com/android/server/input/InputManagerService.java
另外nativeOrbbecNotify()的声明要加进去:
对应JNI层的方法,添加两个索引。
以上是获取icon资源的代码,接下来开始在代码上配置刚才添加的icon。
Frameworks/base/core/java/android/view/PointerIcon.java
添加新icon的index:
添加这两个index的索引功能:
这个索引指向values下的attrrs.xml 和 style.xml文件中的关键变量,前面已经添加过了,注意名字要一致这些细节,上文只是举例名字可能不一样。
到此为止关于mouse的icon资源添加结束,接下来准备实现切换鼠标icon的功能。
2.Java层inputmanagerservices中添加特定广播接收机,在特定情况下切换JNI层 mouse controller的icon raw内容
添加广播接收器:
Frameworks/base/services/java/com/android/server/input/InputManagerService.java
在InputManagerService构造函数中添加以下内容:
注册广播接收,收到特定action “com.example.mouseicon”的时候触发事件,dispatch()接口会向JNI层调用切换icon raw。
代码修改完毕。
3.测试DEMO
新建一个android app project。
测试结果:成功
后续只要在应用的oncreate和ondestroy加入以上发送广播机制,就可实现进入和退出应用的时候切换鼠标icon这个功能。
最后
以上就是虚幻酸奶为你收集整理的Android4.4 鼠标光标切换具体整改鼠标客制化的全部内容,希望文章能够帮你解决Android4.4 鼠标光标切换具体整改鼠标客制化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复