zoukankan      html  css  js  c++  java
  • 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方法。

  • 相关阅读:
    【认证】Apache Shiro对象概念
    【Java基础】char
    【Http】keepalive
    【Nginx】Nginx处理请求过程
    【CSS】块级元素和行内元素
    未A,或用水法,或不熟的题
    2017初二上期中考试总结
    动态规划中的单调队列优化_补充
    NOIP2017普及组翻车记
    对拍模板
  • 原文地址:https://www.cnblogs.com/zharma/p/8371122.html
Copyright © 2011-2022 走看看