发布在我的网站,请访问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 界面开发---控件事件监听器、按键处理
  2. 总体把握Android中的触摸事件处理
  3. cocos2dx android 返回键 Menu键 事件
  4. android用户界面-组件Widget-进度条ProgressBar
  5. Android:30分钟弄明白Touch事件分发机制
  6. 使用android模拟事件,python完成自动化测试
  7. flutter调用android原生组件

随机推荐

  1. 实时数仓|架构设计与技术选型
  2. 回到基础:封装集合
  3. 自学第五十天
  4. Android应用程序的默认最大内存值以及修
  5. 无限重置idea试用期过期时间插件 简单方
  6. Flask WEB表单-WTF简单使用
  7. 优化哈希策略
  8. Constraint遇到的那些坑之Android(安卓)V
  9. 无标题文章
  10. 迭代和函数的递归的学习