<
Android 事件分发传递记录分析
>
上一篇

解决win10任务栏图标空白
下一篇

撸了一款 事件分发传递 的演示app

在说正文之前先说两句。
昨天被问了一个事件分发相关的问题,这是Android很重要的知识点。而且,我个人写的东西也的确是有点杂乱,所以以后也会尽量专注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

接着 moveup 的传递也是一样的. 而把 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 则底层逻辑里会执行这里的点击

如果事件没有正常给view消费, 则会逐层返回上一级 分发顺序是 Activity -> ViewGroup -> View 事件响应顺序是 View -> ViewGroup -> Activity

Top
Foot