在Android开发中,事件分发机制是Android比较重要的知识,熟练应用分发机制有助于更好的解决滑动冲突点击失效等问题,更容易的去开发自定义控件。当然Android面试时事件分发机制是一个躲不掉的问题,能搞清事件分发的来龙去脉,好工作就不远了。
Android事件分发机制的发生在View与View之间或者ViewGroup与View之间,当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window(PhoneWindow)->View
(如图1)
Android事件分发机制主要由三个重要的方法共同完成的
dispatchTouchEvent:用于进行点击事件的分发
onInterceptTouchEvent:用于进行点击事件的拦截
onTouchEvent:用于处理点击事件
只有在ViewGroup中才有onInterceptTouchEvent()方法的
下面我们通过例子介绍一下 用重写了三个重要方法的两个ViewGroup 和重写了两个方法的View
两个ViewGroup是同样的 (如图2)
下面是重写的View(如图3)
我们的界面效果图(如图4)
在我们不做任何处理的情况下点击我们的View1 也就是红色区域 我们的log输出为(如图5)
从我们的日志中可以看出我们事件的分发有两个过程 分发过程和处理过dispatchTouchEvent和onInterceptTouchEvent是分发过程onTouchEvent是处理过程。事件分发是由我们的父控件向子控件进行分发,子控件向控件反馈处理。
下面我们进行对dispatchTouchEvent方法进行处理 分发事件
我们把ViewGroup2的dispatchTouchEvent返回值变为true 表示该控件消费掉该事件不再分发也不会再处理该事件(如图6)
我们把ViewGroup2的dispatchTouchEvent返回值变为false 表示在该控件这里不再分发继续分发并把事件交由父控件处理(如图7)
下面我们进行对onInterceptTouchEvent方法进行处理 事件的拦截
我们把ViewGroup2的onInterceptTouchEvent返回值变为false 表示该控件不会拦截该事件 继续分发 log输出信息(如图5)与我们不做处理时是一样的
我们把ViewGroup2的onInterceptTouchEvent返回值变为true 表示该控件拦截该事件 不再往子空间进行分发,然后进行层级的处理过程 (如图8)
下面我们进行对onTouchEvent方法进行处理 事件的处理
我们把View1的onTouchEvent返回值变为true 表示该控件处理该事件,不再往父控件反馈 (如图9)
简单总结 事件分发的过程是由父控件向子控件进行分发 子控件可以选择处理该事件也可以继续分发也可以反馈给上级处理。就是这样的一个层级过程。