在说正文之前先说两句。
昨天被问了一个事件分发相关的问题,这是Android很重要的知识点。而且,我个人写的东西也的确是有点杂乱,所以以后也会尽量专注Android相关内容。
正文来了。
当触摸屏幕时,事件类型, 可以有以下几种:
down
> move
> up
> click
*这里会把 view 的 setOnClickListenr 和 setOnTouchListener 也放在一起分析了
当按下屏幕时, 事件 down
在 Activity, ViewGroup, View 中传递顺序:
MainActivity: dispatchTouchEvent: down
CustomViewGroup: dispatchTouchEvent: down
CustomViewGroup: onInterceptTouchEvent: down
CustomView: dispatchTouchEvent: down
CustomView: onTouchEvent: down
接着 move
和 up
的传递也是一样的. 而把 View.setOnClickListener
监听和 View.setOnTouchListener
放在一起, 完整的流程如下
MainActivity: dispatchTouchEvent: down
CustomViewGroup: dispatchTouchEvent: down
CustomViewGroup: onInterceptTouchEvent: down
CustomView: dispatchTouchEvent: down
MainActivity: view.setOnTouchListener: down //触摸监听会在view的onTouchEvent响应方法之前执行 监听方法里如果返回true代表已消费掉事件则不会走view的onTouchEvent
CustomView: onTouchEvent: down
MainActivity: dispatchTouchEvent: move
CustomViewGroup: dispatchTouchEvent: move
CustomViewGroup: onInterceptTouchEvent: move
CustomView: dispatchTouchEvent: move
MainActivity: view.setOnTouchListener: move
CustomView: onTouchEvent: move
MainActivity: dispatchTouchEvent: up
CustomViewGroup: dispatchTouchEvent: up
CustomViewGroup: onInterceptTouchEvent: up
CustomView: dispatchTouchEvent: up
MainActivity: view.setOnTouchListener: up
CustomView: onTouchEvent: up
MainActivity: view.setOnClickListener: click //在up的onTouchEvent响应方法的返回如果是调用 super.onTouchEvent 则底层逻辑里会执行这里的点击
Activity -> ViewGroup -> View
事件响应顺序是 View -> ViewGroup -> Activity