• Android--View事件传递


    Android--View事件传递#

    View事件传递首先要明白以下要素:

    1. 事件就是MotionEvent.该对象包含了传递的事件中的所有信息
    2. 事件的来源是Window(即PhoneWindow),包含window的是Activity.所以可以认为事件的源头是Activity
    3. 对事件的操作包括:
      1. 分发, 通过dispatchTouchEvent()分发
      2. 拦截, 通过onInterceptTouchEvent()拦截
      3. 消费、处理, 通过OnTouchListener接口的onTouch()方法监听处理(有限处理监听),通过onTouchEvent()方法处理,先过onTouch,onTouch消费事件则不过onTouchEvent,onTouch方法不消费事件,则过onTouchEvent
    4. 对事件消费处理的函数:返回true表示消费掉,false表示不消费
    5. 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,事件都是以 ACTION_DOWN 开始 ACTION_UP 结束,回传的事件是一个事件序列,从ACTION_DOWN到ACTION_UP。必须先消费ACTION_DOWN,才能消费后续的动作,否则后续任何动作都不会被消费!
    6. 子View可以利用父View的requestDisallowInterceptTouchEvent方法不允许父View拦截事件

    基于对以上要素的认识。就可以分析事件分发的流程。

    事件分发流程###

    1. 事件的源头从Activity的dispatchTouchEvent方法传递进来,默认Activity总是不消费事件的。所以事件交给PhoneWindow的superDispatchTouchEvent()方法。
    2. PhoneWindow把事件传递给DecorView(这是界面的根ViewGroup)的superDispatchTouchEvent()方法。
    3. DecorView按照父类ViewGroup的superDispatchTouchEvent方法处理事件
    4. 事件在没有被拦截和消费的情况下会逐次传递到下一级的View
    5. 最后一级的View的onTouchEvent方法会消费掉事件返回true

    上面是没有事件拦截的情况。当然事件在从父一级传递到子一级View的时候,父View可以通过onInterceptTouchEvent()拦截事件,停止向下传递。

    如果出现最后一级的View没有消费掉事件(OnTouchListener接口的onTouch()方法监听返回false,onTouchEvent()方法返回false),那么事件会依次向父view一级传递。这时候父View一级的onTouchEvent会被调用,要消费就返回true,不消费就返回flase。

    如果各个层级的View都不消费事件,那么最后事件会返回到Activity,交给Activity的onTouchEvent方法。

  • 相关阅读:
    小程序教程3
    小程序教程2
    小程序教程1
    sublime介绍常用插件和快捷键
    ionic1跨域问题
    上传文件到windows server, 导出文件到linux, 打包压缩
    windows远程管理服务winrm
    windows配置ssh服务
    前端:websocket脚本
    前端实现: 抓拍和定时弹出任务
  • 原文地址:https://www.cnblogs.com/zharma/p/8371122.html
Copyright © 2020-2023  润新知