UI 06: onTouch 源码分析
2024-06-05 本文已影响0人
xqiiitan
4.onTouch 源码分析,【控件的 事件分发】。
父布局 不断分发事件给 子布局-
ViewGroup::dispatchTouchEvent()。
--> dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)
--> child.dispatchTouchEvent(event)
View::dispatchTouchEvent(e)
View::onTouchEvent(e) // 覆写的方法
// 当 自定义类的onTouchEvent 返回false。
if(!result && onTouchEvent(event)) {
result = true;
}
进而导致ViewGroup:: addTouchTarget()不会执行, 它里面的 mFirstTouchTarget 不会被赋值 是null。
final boolean intercepted;
if(actionMasked == MotionEvent.ACTION_DOWN || mFirstTouchTarget != null) {
...
} else {
// 当move事件进来的时候。
intercepted = true;
}
// 拦截变成 intercepted = true。
if(!canceled && !intercepted) { // 整体是false。
// 导致 dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign) 不会得到调用。
// move 事件不会分发, View.dispatchTouchEvent() 执行不到。
// 进而导致View.onTouchEvent() 执行不到。
// Move事件 进不来。
}
// 当 自定义类的onTouchEvent 返回true。
mFirstTouchTarget 不为空,
intercepted 的值就是false。
if(!canceled && !intercepted) { // 整体是true。
dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign) 会得到调用。
// move 事件继续分发,View.dispatchTouchEvent() 执行
// 进而执行 View.onTouchEvent()
// 进入处理move事件的逻辑。
}