发布在我的网站,请访问http://hukai.me/blog/android-notes-06-touch-event-dispatch-process/


1)概述

Android的TouchEvent通常包含三个动作,ACTION_DOWN,ACTION_MOVE与ACTION_UP。发出的顺序是DOWN->MOVE->MOVE->…->UP(注意MOVE事件是否能够被触发取决于操作手势里面是否包含了移动的动作)。

消息分发流程,从上到下,从父到子:Activity->ViewGroup1->ViewGroup1的子ViewGroup2->…->Target View
消息响应流程,从下到上,从子到父:Target View->…->ViewGroup1的子ViewGroup2->ViewGroup1->Activity

  • public boolean dispatchTouchEvent(MotionEvent ev);
    事件分发处理函数,通常会在Activity层根据UI的显示情况,把事件传递给相应的ViewGroup。下面的演示代码中,为了方便模拟,会直接return true,解说中称之为“丢弃”。(因为事件实际上没有传递给任何组件,没有被消费,而且是主动的行为,故称之为丢弃)

  • public boolean onInterceptTouchEvent(MotionEvent ev);
    对分发的事件进行拦截,注意拦截ACION_DOWN与其他ACTION的差异。
    第1种情况:如果ACTION_DOWN的事件没有被拦截,顺利找到了TargetView,那么后续的MOVE与UP都能够下发。如果后续的MOVE与UP下发时还有继续拦截的话,事件只能传递到拦截层,并且发出ACTION_CANCEL。
    第2种情况:如果ACITON_DOWN的事件下发时被拦截,导致没有找到TargetView,那么后续的MOVE与UP都无法向下派发了,在Activity层就终止了传递。

  • public boolean onTouchEvent(MotionEvent ev);
    响应处理函数,如果有设置对应listener的话,这里还会与onTouch,onClick,onLongClick有关联。具体执行顺序是onTouch()->onTouchEvent()->onClick()->onLongClick()。是否能够顺序执行,取决于每个方法的返回值是true还是false。具体这里不展开说。

强关注点:dispatch与intercept的差异,ACTION_DOWN与其他ACITON会对寻找target组件带来差异,而是否寻找到Target组件对整个流程有着重大的的影响。


查看更多请点击: http://hukai.me/blog/android-notes-06-touch-event-dispatch-process/

更多相关文章

  1. Android--SoLoader,android动态加载so库
  2. [android]在上下文菜单的选中事件中获取列表选中的元素
  3. android 多点触控
  4. Android解决父控件拦截子控件手势滑动事件的问题
  5. Android下模拟按键输入
  6. android touch事件解析
  7. My Android成长之路(四)——【xml解析之XmlPull】
  8. android中MotionEvent.ACTION_CANCEL事件如何被触发?
  9. Android中的dispatchTouchEvent()、onInterceptTouchEvent()和on

随机推荐

  1. Android(安卓)NDK学习笔记
  2. 用Xamarin 实现园友的 :Android浮动小球与
  3. Android漫游记(1)---内存映射镜像(memory
  4. Android中view重绘问题
  5. Android(安卓)面试题总结之Android(安卓)
  6. Android的Camera架构介绍
  7. Android创始人安迪 罗宾(Andy Rubin)离职
  8. android之Menu
  9. Android(安卓)应用程序基础
  10. Android(安卓)(SQLite 数据库与ContentPr