Android4.4不支持鼠标,Android4.4 鼠标光标切换具体整改

鼠标客制化

目的:在应用层,进入特定的应用显示自己的指定的鼠标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

系统默认文件如下:

0818b9ca8b590ca3270a3433284dd417.png

增加完自己准备的图片和xml(xml直接复制就可以)

0818b9ca8b590ca3270a3433284dd417.png

Xml文件里的内容也要修改:

原本:

0818b9ca8b590ca3270a3433284dd417.png

添加的xml:

0818b9ca8b590ca3270a3433284dd417.png

三个drawable分别这么修改。

1.修改frameworks/base/core/res/res/values下的文件

Styles.xml中添加一个我们自己的icon item

0818b9ca8b590ca3270a3433284dd417.png

添加的ICON名字是pointerOrbbecIconArrow

Java代码中会根据这个名字来寻找图片资源,所以一定要准确。

Attrs.xml文件 添加刚才的icon

0818b9ca8b590ca3270a3433284dd417.png

到这里icon资源配置修改完毕。

2.代码修改:

1.修改JNI层代码:

frameworks/base/services/jni/com_android_server_input_InputManagerService.cpp

函数:obtainPointerController

主要是添加一个if分之对controller非空的处理,这个时候要注意要用系统原先的mouse controller故注释掉new语句。原来的if句稍作修改:

0818b9ca8b590ca3270a3433284dd417.png

这里修改了Android原生的方法getPointerIcon的参数,也就是加了一个整型参数,对应的JNI层函数声明和注册java method都要留意修改,JAVA层的接口也要对应修改。

下面是加了一if分之,因为开机第一次controller是NULL,肯定进了第一个if句,后面controller非NULL,所以想换icon就是进入下面这个if分之了:

0818b9ca8b590ca3270a3433284dd417.png

JAVA层通过渠道会调用到这个方法,这里为了不破坏这个方法的参数结构,重新声明定义了一个native函数,java层通过app不同的cmd而向JNI层下达对应cmd以show出不同的icon,具体如下:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

这边修改了JNI会掉java方法的参数getPointerIcon(),使其有个整型参数,用于区别不同的icon index。还添加了函数nativeOrbbecNotify(),所以

在这个文件的注册java method的地方也要修改: 在函数:

int register_android_server_InputManager(JNIEnv* env) {

0818b9ca8b590ca3270a3433284dd417.png

static JNINativeMethod gInputManagerMethods[] = {

0818b9ca8b590ca3270a3433284dd417.png

JNI的修改到此为止。

2.java 层的修改

Frameworks/base/services/java/com/android/server/input/InputManagerService.java

0818b9ca8b590ca3270a3433284dd417.png

另外nativeOrbbecNotify()的声明要加进去:

0818b9ca8b590ca3270a3433284dd417.png

对应JNI层的方法,添加两个索引。

以上是获取icon资源的代码,接下来开始在代码上配置刚才添加的icon。

Frameworks/base/core/java/android/view/PointerIcon.java

添加新icon的index:

0818b9ca8b590ca3270a3433284dd417.png

添加这两个index的索引功能:

0818b9ca8b590ca3270a3433284dd417.png

这个索引指向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构造函数中添加以下内容:

0818b9ca8b590ca3270a3433284dd417.png

注册广播接收,收到特定action“com.example.mouseicon”的时候触发事件,dispatch()接口会向JNI层调用切换icon raw。

代码修改完毕。

3.测试DEMO

新建一个android app project。

0818b9ca8b590ca3270a3433284dd417.png

测试结果:成功

后续只要在应用的oncreate和ondestroy加入以上发送广播机制,就可实现进入和退出应用的时候切换鼠标icon这个功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值