在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 * }