zoukankan      html  css  js  c++  java
  • Android View事件传递机制

    ViewGroup

    dispatchTouchEvent onInterceptTouchEvent onTouch

    View

    dispatchTouchEvent onTouch

    假设View的层级关系如下

    <ViewGroup1>
        <ViewGroup2>
            <View/>
        </ViewGroup2>
    </ViewGroup1>
    • View事件传递顺序ACTION_DOWN

    由最上层ViewGroup通过dispathcTouchEvent,如果事件没有被消费(dispatchTouchEvent return true),或者拦截(onInterceptTouchEvent return true),就会逐层传往下递到最底层View,如下所示

    Activity.dispatchTouchEvent-->ViewGroup1.dispatchTouchEvent-->ViewGroup1.onInterceptTouchEvent-->ViewGroup2.dispatchTouchEvent-->ViewGroup2.onInterceptTouchEvent-->View.dispatchTouchEvent

    如果事件没有被消费(onTouchEvent return true),会逐层往上调用onTouchEvent,如下所示

    View.onTouchEvent()->ViewGroup1.onTouchEvent()->ViewGroup1.onTouchEvent()->Activity.onTouchEvent();

    由于ACTION_DOWN事件没有被消费,说明下层View对点击事件没有兴趣,ACTION_MOVE事件不会再继续往下传递

    如果事件被消费,比如设置onTouchListener或者onTouchEvent返回true,则事件不会往上传递,哪一层消费,再往上的onTouchEvent就不会被调用。而且底部的ViewGroup,View继续会接收之后传进来的ACTION_MOVE事件

    • requestDisallowInterceptTouchEvent(true)

    如果子View在消费onTouch事件之后(比如ACTION_DOWN),调用getParent.requestDisallowInterceptTouchEvent(true),那么下一个ACTION_MOVE到来的时候,不会再调用View的父Group的onInterceptTouchEvent()方法

      即:子View没有调用requestDisallowInterceptTouchEvent(true); (onInterceptTouchEvent用OITE缩写,onTouchEvent用OTE缩写)

        VG1.OITE(ACTION_DOWN)->VG2.OITE(ACTION_DOWN)->VIEW.OTE(ACTION_DOWN) return true 

            如果子View在onTouchEvent里调用getParent().requestDisallowInterceptTouchEvent(true),则事件传递会变为如下(ACTION_DOWN事件之后会传来ACTION_MOVE)

        VG1.OITE(ACTION_MOVE)->VG2.OITE(ACTION_MOVE)->VIEW.OTE(ACTION_MOVE) return true(中间划横线表示这个方法没被调用了)

      注:dispatchTouchEvent会继续调用

    • 总结

    1.哪一层dispatchTouchEvent消费事件,事件就不会往下传,

    2.哪一层消费onTouchEvent,事件onTouchEvent就不会再往上传

    3.如果没有消费ACTION_DOWN,ACTION_MOVE不会像ACTION_DOWN一样,一层一层往下传,直接Activity.dispatchTouchEvent->Activity.onTouchEvent

      相反,如果有消费ACTION_DOWN,ACTION_MOVE事件还是会像ACTION_DOWN一样,一层一层往下传,原理和ACTION_DOWN一样

      即,如果消费ACTION_DOWNACTION_MOVE才会传下来,如果消费了ACTION_MOVEACTION_UP事件才会传下来

      不消费ACTION_DOWN,其他事件不会再传下来

    
    
  • 相关阅读:
    QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法
    hdu 5312 Sequence(数学推导——三角形数)
    Windows 操作系统与 .NET Framework
    Cocos2d-x手机游戏开发与项目实践具体解释_随书代码
    Uva 10081 Tight words (概率DP)
    从零使用qemu模拟器搭建arm执行环境
    hdu 2255 奔小康赚大钱(KM算法)
    最大子序列和问题
    深入理解javascript之高级定时器
    openstack 镜像自动扩容 resize拉伸
  • 原文地址:https://www.cnblogs.com/baron89/p/4642721.html
Copyright © 2011-2022 走看看