Android 事件分发

在Android开发中,事件分发机制是Android比较重要的知识,熟练应用分发机制有助于更好的解决滑动冲突点击失效等问题,更容易的去开发自定义控件。当然Android面试时事件分发机制是一个躲不掉的问题,能搞清事件分发的来龙去脉,好工作就不远了。

Android事件分发机制的发生在View与View之间或者ViewGroup与View之间,当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window(PhoneWindow)->View   

(如图1)


Android 事件分发_第1张图片
图1


Android事件分发机制主要由三个重要的方法共同完成的

dispatchTouchEvent:用于进行点击事件的分发

onInterceptTouchEvent:用于进行点击事件的拦截

onTouchEvent:用于处理点击事件

只有在ViewGroup中才有onInterceptTouchEvent()方法的


下面我们通过例子介绍一下 用重写了三个重要方法的两个ViewGroup 和重写了两个方法的View

两个ViewGroup是同样的 (如图2)

Android 事件分发_第2张图片
图2

下面是重写的View(如图3)

Android 事件分发_第3张图片
图3

我们的界面效果图(如图4)

Android 事件分发_第4张图片
图4

在我们不做任何处理的情况下点击我们的View1 也就是红色区域  我们的log输出为(如图5)

Android 事件分发_第5张图片
图5

从我们的日志中可以看出我们事件的分发有两个过程 分发过程和处理过dispatchTouchEvent和onInterceptTouchEvent是分发过程onTouchEvent是处理过程。事件分发是由我们的父控件向子控件进行分发,子控件向控件反馈处理。


下面我们进行对dispatchTouchEvent方法进行处理 分发事件 

我们把ViewGroup2的dispatchTouchEvent返回值变为true 表示该控件消费掉该事件不再分发也不会再处理该事件(如图6)

Android 事件分发_第6张图片
图6


我们把ViewGroup2的dispatchTouchEvent返回值变为false 表示在该控件这里不再分发继续分发并把事件交由父控件处理(如图7)

Android 事件分发_第7张图片
图7

下面我们进行对onInterceptTouchEvent方法进行处理 事件的拦截

我们把ViewGroup2的onInterceptTouchEvent返回值变为false 表示该控件不会拦截该事件 继续分发 log输出信息(如图5)与我们不做处理时是一样的 

我们把ViewGroup2的onInterceptTouchEvent返回值变为true 表示该控件拦截该事件 不再往子空间进行分发,然后进行层级的处理过程  (如图8)

Android 事件分发_第8张图片
图8

下面我们进行对onTouchEvent方法进行处理 事件的处理

我们把View1的onTouchEvent返回值变为true 表示该控件处理该事件,不再往父控件反馈  (如图9)

Android 事件分发_第9张图片
图9


简单总结   事件分发的过程是由父控件向子控件进行分发  子控件可以选择处理该事件也可以继续分发也可以反馈给上级处理。就是这样的一个层级过程。

你可能感兴趣的:(Android 事件分发)