多点触摸在 android 上的实现.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多点触摸在 android 上的实现 框架图 多点触摸驱动的上报机制: 首先对上报参数进行定义: input_set_abs_params(mcs_data.input, ABS_MT_POSITION_X, pdata-abs_x_min, pdata-abs_x_max, 0, 0); input_set_abs_params(mcs_data.input, ABS_MT_POSITION_Y, pdata-abs_y_min, pdata-abs_y_max, 0, 0); 多点触摸驱动采用连续上报的机制,首先上报第一个手指的数据(ABS_MT_POSITION_X,ABS_MT_POSITION_Y),再发送(SYN_MT_REPORT)代表第一个手指数据发送结束,第二个手指同样也是(ABS_MT_POSITION_X,ABS_MT_POSITION_Y),再发送(SYN_MT_REPORT)依次类推最后一轮结束发送SYN_REPORT    下面是两指触摸的最小事件集 : ABS_MT_POSITION_X ABS_MT_POSITION_Y SYN_MT_REPORT //上报第一指坐标数据 ABS_MT_POSITION_X ABS_MT_POSITION_Y SYN_MT_REPORT//上报第二指坐标数据 SYN_REPORT  协议解析   “触摸”这个词用来描述工具(手指,笔,等)直接接触触摸屏表面。 ABS_MT_TOUCH_MAJOR   接触面的长轴。 ABS_MT_TOUCH_MINOR   接触面的短轴,如果是圆形接触面,这个参数可以省略。 ABS_MT_WIDTH_MAJOR   接触工具的长轴。 ABS_MT_WIDTH_MINOR 接触工具的切面的短轴,如果是圆形,此参数可以省略。 以上宏的具体位置参照input.h Android 的中间层: 同样在android 的中间层也定义了与内核相应的软件位参考(RawInputEvent.java),那么android的是如何区分多点触摸和单点触摸的呢?具体实现参照(EventHub.cpp),列举代码如下: int EventHub::open_device(const char *deviceName) { 厖厖厖厖?vent if (test_bit(ABS_MT_TOUCH_MAJOR, abs_bitmask) test_bit(ABS_MT_POSITION_X, abs_bitmask) test_bit(ABS_MT_POSITION_Y, abs_bitmask)) { device-classes |= CLASS_TOUCHSCREEN | CLASS_TOUCHSCREEN_MT; // LOGI(It is a multi-touch screen!); } //single-touch? else if (test_bit(BTN_TOUCH, key_bitmask) test_bit(ABS_X, abs_bitmask) test_bit(ABS_Y, abs_bitmask)) { device-classes |= CLASS_TOUCHSCREEN; // LOGI(It is a single-touch screen!); } 厖厖厖f (.. } 既然知道了是多点触摸还是单点触摸android在InputKeyQueue.java 中把获得的数据重新打包成应用层可以识别的event具体实现参考该文件的mThread 线程,该线程主要就是不断的获得kenel上报的数据通过InputDevice.java 中的generateAbsMotion()完成对多点数据到event的转换。这样后面的处理就由中间层完成。 应用层 在应用层我们只要重载OnTouchListener 接口我们就可以获得触摸事件的event。代码参考如下: import android.view.MotionEvent; import android.view.View.OnTouchListener; public class Touch extends Activity implements OnTouchListener { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layo

您可能关注的文档

文档评论(0)

feiyang66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档