关于Android事件分发,想必是哪个Android 开发者都绕不开的基础知识。今天就简短的梳理一下,并用简单的Demo进行演示:
首先得知道,Android 事件在哪几个对象之间传递呢?
答:Activity、ViewGroup、View
在这三个对象之间的事件传递的方法有哪些呢?直接上demo代码片段:
Activity 代码:
自定义view代码片段:
自定义ViewGroup代码片段:
知道了以上,再简单的进行验证一下事件分发的流程:
很简单的案例,当点击这个按钮的时候,我们看看事件分发的执行顺序;
2020-05-31 16:39:15.317 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.318 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.318 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.318 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.318 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.335 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.336 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.336 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.336 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.336 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.346 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.346 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.346 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.346 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.346 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.355 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.355 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.355 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.355 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.355 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.366 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.366 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.366 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.366 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.366 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.375 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.375 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.375 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.375 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.375 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.384 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.385 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.385 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.385 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.385 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.398 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.398 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.398 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.398 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.398 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.424 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.424 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.424 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.424 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.424 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.440 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.441 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.441 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.441 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.441 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
2020-05-31 16:39:15.443 28777-28777/com.example.mydemo E/----事件分发----: MainActivity==dispatchTouchEvent
2020-05-31 16:39:15.443 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==dispatchTouchEvent
2020-05-31 16:39:15.444 28777-28777/com.example.mydemo E/----事件分发----: MyViewGroup==onInterceptTouchEvent
2020-05-31 16:39:15.444 28777-28777/com.example.mydemo E/----事件分发----: MyView==dispatchTouchEvent
2020-05-31 16:39:15.444 28777-28777/com.example.mydemo E/----事件分发----: MyView==onTouchEvent
因为事件分发的方法默认返回false,我们将Activity 中的dispatchTouchEvent 的返回值改为true
Log日志如下:
关于事件分发,大家可以借着这个例子继续往下试。
顺便说下关于事件分发机制的实现,是按什么设计模式实现的吗?
职责链模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
如果这篇文章对你有帮助,那就点个赞吧;