Input系统学习-----move事件的合并

在onTouchEvent里打印log跟踪ACTION_DOWN事件和ACTION_MOVE事件的堆栈,会发现不一样,这里直接说一下结论,在应用端接收到touch事件的时候,会对move事件会进行合并,合并到event的history数据中,这样就不用频繁的在主线程中传送move数据,move事件的传送和Chreographer关联起来,屏幕刷新一次,调用一次move事件的传送,在这期间的move事件合并到history数据中,可以通过获取history相关方法去得到。

合并的处理可以跟踪consumeBatchedInputEvents方法看到,这个承上启下的方法,我们就可以通过其直观翻译“消费批量深入事件”来进行记忆。

刚开始看MotionEvent的时候,还很好奇,MotionEvent里的history数据是怎么来的,

接触到consumeBatchedInputEvents就贯穿起来了,可以看出,合成是在应用端进行的,服务端(IMS)的motionevent是单个的瞬时状态,是没有history数据的,input从下到上的处理流程真是复杂,一个touch的传送是那样的曲折。

frameworks/base/core/java/android/view/MotionEvent.java

98 * void printSamples(MotionEvent ev) {
99 *     final int historySize = ev.getHistorySize();
100 *     final int pointerCount = ev.getPointerCount();
101 *     for (int h = 0; h < historySize; h++) {
102 *         System.out.printf("At time %d:", ev.getHistoricalEventTime(h));
103 *         for (int p = 0; p < pointerCount; p++) {
104 *             System.out.printf("  pointer %d: (%f,%f)",
105 *                 ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h));
106 *         }
107 *     }
108 *     System.out.printf("At time %d:", ev.getEventTime());
109 *     for (int p = 0; p < pointerCount; p++) {
110 *         System.out.printf("  pointer %d: (%f,%f)",
111 *             ev.getPointerId(p), ev.getX(p), ev.getY(p));
112 *     }
113 * }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值