详细可看,这哥们花了点心思总结:点鸡我
以下是我自己的总结:
1:WindowService 循环读取用户输入事件,使用生产者消费者模式将事件传递到当前Activity,如何传递,Activity 内有个PhoneWindon 对象并且Activity实现了Windon.Callback,该对象通过setCallback(this) 方法与Window相关联,即在屏幕有用户输入时,首先WindowService 会将事件封装在MotionEvent 对象以参数形式传递给回调方法dispatchTouchEvent() 方法。
2:Activity dispatchTouchEvent(MotionEvent event) ->PhoneWindow.DocorView.superDispatchTouchEvent()->ViewGroup.dispatchTouchEvent() ;
3:在ViewGroup dispatchTouchEvent() 方法中,先判断自己是否拦截该事件即 onInterceperTouchEvent() 返回true or false ,false 代表不拦截,然后再根据触发点的坐标锁定子View ,然后走View 中 dispatchTouchEvent,如果触发点没有在子View上,则走super.dispatchTouchEvent() ->View.dispatchTouchEvent() ->View.onTouchEvent()自己去消事件
4:走完所有View 时间分发后,如果最终返回的是false,则走 Activity touchEvent 方法,到此结束,如果最终返回true,到此结束
网友评论