注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东月之神

在单纯的观念里面,生命就容易变得比较深刻!

 
 
 

日志

 
 
关于我

别驻足,梦想要不停追逐,别认输,熬过黑暗才有日出,要记住,成功就在下一步,路很苦,汗水是最美的书!

网易考拉推荐

(转)Android添加鼠标支持  

2012-03-31 08:13:27|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android默认是没有鼠标支持的,但在Android系统会应用到许多其他的地方,如平板电脑、电视中,许多时候就需要鼠标的支持。

支持原理:Android中有原生的Touch事件,鼠标的各种事件都可以转换为各种Touch事件,将鼠标事件走与Touch事件相关的路径就可以实现。需要注意的是,在屏幕旋转后,鼠标的坐标等信息需要程序处理才能正确。

修改文件概览:
C++文件:
 

             frameworks\base\include\ui\EventHub.h
              frameworks\base\libs\ui\EventHub.cpp
java文件:
               frameworks\base\core\java\android\view\RawInputEvent.java
               frameworks\base\services\java\com\android\server\InputDevice.java
               frameworks\base\services\java\com\android\server\KeyInputQueue.java
               frameworks\base\services\java\com\android\server\WindowManagerService.java

文件功能描述
              EventHub.h                          增加鼠标设备的定义
              EventHub.cpp                   函数open_device(const char *deviceName)中增加鼠标类型
              RawInputEvent.java             增加鼠标设备
              InputDevice.java                  增加鼠标连接状态标志
                                                MotionState中增加方法 generateMouseMotion()将原始鼠标事件转化为
                                                    MotionEvent事件
              KeyInputQueue.java     在事件RawInputEvent.EV_DEVICE_ADDED中判断鼠标设备,动态增加
                                                在事件RawInputEvent.EV_DEVICE_REMOVED中,动态判断鼠标删除
                                                在ev.type == RawInputEvent.EV_KEY中增加鼠标左中右键处理
                                                在ev.type == RawInputEvent.EV_REL中增加鼠标坐标变动和滚轮的处理
                                                  recycleEvent()中增加鼠标相关的清理工作
             WindowManagerService.java    实现在界面上的画鼠标及移动鼠标的工作。

如果你的Android设备支持鼠标,你将会发现默认的光标为灰色半透明的三角形,系统的默认主题是黑色的,造成很难发现鼠标的位置。所以本文介绍怎样定制Android系统的鼠标光标。
     Android系统对鼠标的支持并不好,因为Android系统原本是为手机量身定做的,手机系统基本上是不需要鼠标的。但是随着Android系统移植到其他领域,对鼠标的支持也越来越有意义。现在Android已经支持鼠标了,但是有一个完善的过程。本文后面会介绍到Android对鼠标支持的一些不足。

     原来我以为Android系统的光标会和Windows差不多,是一个图片资源呢。这样的话,我只需要替换掉这个图片就可以搞定了。找了好久都没有找到图片资源的位置,最终反过来思考,Android系统鼠标光标非常简单,手动绘制也不是很难的事情。会不会是代码中绘制的呢?

     沿着这个思路,终于在WindowManagerService.java中,找到了相关的代码:

frameworks/base/services/java/com/android/server/WindowManagerService.java

相关的代码位于performLayoutAndPlaceSurfacesLockedInner方法中:

 mMouseSurface = new Surface(mFxSession, 0,-1,mMw,mMh, PixelFormat.TRANSPARENT, Surface.FX_SURFACE_NORMAL); mCanvas = mMouseSurface.lockCanvas(null); mCanvas.drawColor(0x0); mPath.moveTo(0.0f, 0.0f); mPath.lineTo(16.0f, 0.0f); mPath.lineTo(0.0f, 16.0f); mPath.close(); mCanvas.clipPath(mPath); mCanvas.drawColor(0x66666666); mMouseSurface.unlockCanvasAndPost(mCanvas); mMouseSurface.openTransaction(); mMouseSurface.setSize(mMw,mMh); mMouseSurface.closeTransaction();

     可以看出默认情况下Android系统用颜色值0×66666666绘制了一个三角形,这个颜色值为32bit——A8R8G8R8,A表示透明度,0表示全部透明,0xff为不透明,0×66表示半透明。

     你可以修改其中代码来修改鼠标光标的形状,需要学习一下Android绘图系统,熟悉Paint,Canvas等概念,不过挺简单的。下面是我的光标绘制的代码:

 mMouseSurface = new Surface(mFxSession, 0,-1,mMw,mMh, PixelFormat.TRANSPARENT, Surface.FX_SURFACE_NORMAL); mCanvas = mMouseSurface.lockCanvas(null); mCanvas.drawColor(0x0); mPath.moveTo(0.0f, 0.0f); mPath.lineTo(0.0f, 19.0f); mPath.lineTo(14.0f, 14.0f); mPath.close(); mCanvas.clipPath(mPath); mCanvas.drawColor(0xFFFFFFFF); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(0xFF000000); mCanvas.drawPath(mPath, paint); mMouseSurface.unlockCanvasAndPost(mCanvas); mMouseSurface.openTransaction();                

绘制的光标为一个瘦一点儿的不透明的白色填充的三角形,然后用黑色给白色三角形描边。主要是模仿Windows的光标风格,对于各种颜色基调的主题这个光标都可以很清晰。

     可以看出Android系统鼠标光标的定制不是非常容易,需要修改代码,相信Android后续版本会对鼠标的支持有改进。以上代码仅供参考,如有错误敬请指正。

  评论这张
 
阅读(3172)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017