宝宝们,事件分发机制必须的“必”必问的“问”,好吗!他这样问你
说说你对事件分发机制的理解?
如果触发一个点击事件,都没有消费,最后回到哪里?
分析一下触摸屏幕后源码流程?
上干货!!!
说说你对事件分发机制的理解?
如果触发一个点击事件,都没有消费,最后回到哪里?
有三个重要方法:
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
这三个方法的关系是onInterceptTouchEvent和onTouchEvent在dispatchTouchEvent中执行。
1.当有一个点击事件。最先activity会来处理,然后传递给PhoneWindow,再传递给DecorView,最后传给顶层ViewGroup。一般传递事件只考虑ViewGroup的onInterceptTouchEvent,因为一般情况不会重写dispatchTouchEvent。
对于根ViewGroup,会先传递到它的dispatchTouchEvent,如果onInterceptTouchEvent返回true,表示这个ViewGroup要拦截,那么交由它的onTouchEvent处理。如果返回false,最后回到底层子View的onTouchEvent处理。
2.如果子View的onTouchEvent返回true,表示这个事件就消费了,如果返回false,就会传递到父ViewGroup的onTouchEvent处理。如果还返回false,就交给父View的父View,如此反复。
分析一下触摸屏幕后源码流程?
1.当事件产生后,最先判断的是DOWN事件。一个完整的事件以DOWN开始,UP结束。如果ViewGroup的onInterceptTouchEvent拦截,则mFirstTouchTarget!=null为false,那么MOVE和UP事件记录intercepted为true。
2.分析View的dispatchTouchEvent。如果看到mTouchListener不为空且onTouch返回true,表示事件消费。就不会执行onTouchEvent了。所以mTouchListener优先级高于onTouchEvent。如果CLICKABLE或LONG_CLICKABLE为true,那么onTouchEvent就返回true。如果View设置了setClickListener会自动设置CLICKABLE为true。