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

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

(如图1)


图1


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

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

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

onTouchEvent:用于处理点击事件

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


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

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

图2

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

图3

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

图4

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

图5

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


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

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

图6


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

图7

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

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

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

图8

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

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

图9


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

更多相关文章

  1. 简洁、高效、可自定义的开源的Android评论控件---CommentView
  2. Android轮播图控件CustomBanner的使用讲解
  3. Android界面编程——Android高级UI组件(三)
  4. Android(安卓)深入解析用户界面(一)
  5. android 弹出日期滑动选择框,日期滚动滑动选择
  6. android pull解析
  7. Android(安卓)操作软键盘
  8. Android(安卓)采用PULL来解析XML
  9. android ListView 九大重要属性详细分析

随机推荐

  1. Android(安卓)打开PDF,PPT,WORD,EXCEL,CH
  2. 使用Android(安卓)Stdio出现':app:transf
  3. Android TextView的marquee跑马灯无效的
  4. Android AIDL跨进程通讯
  5. Android LruCache使用分析
  6. Android 处理多线程 UserTask
  7. Android SDK API 13升级指南
  8. Android下的数据储存方式(三)
  9. android学习——EditText的属性
  10. android Activity加载完成后的监听事件