android 触摸事件传递机制与笔记

一、笔记链接

1. android 触摸事件传递机制

Android:30分钟弄明白Touch事件分发机制 https://www.cnblogs.com/linjzong/p/4191891.html

2. android OnTouchListener,onTouchEvent,onClickListener执行顺序 

http://blog.csdn.net/xw13782513621/article/details/76648557

二、简记

1. android 触摸事件传递机制

1.1Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。

1.2.ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。

1.3.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。

1.4.当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。

1.5.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。

/**
     * ViewGroup
     * @param ev
     * @return
     */
    public boolean dispatchTouchEvent(MotionEvent ev){
        ....//其他处理,在此不管
        View[] views=getChildView();
        for(int i=0;i
要特别注意FrameLayout中子view的触摸事件传递:默认情况下(即不消费触摸事件),重叠的多个view都会接收到触摸事件

FrameLayout 实例1(评论是重点), 实例2

2. android OnTouchListener,onTouchEvent,onClickListener执行顺序 

首先执行OnTouchListener,之后为onTouchEvent,最后才执行onClickListener内的方法

public boolean dispatchTouchEvent(MotionEvent event) {
        ......
        ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnTouchListener != null
                && (mViewFlags & ENABLED_MASK) == ENABLED
                && li.mOnTouchListener.onTouch(this, event)) {
            result = true;
        }
        if (!result && onTouchEvent(event)) {
            result = true;
        }
        ......
        return result;
    }
public boolean onTouchEvent(MotionEvent event) {
        ......
        switch (action) {
             case MotionEvent.ACTION_UP:
                  ......
                  performClick();
                  ......
                  break;
        ......
    }

public boolean performClick() {
        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
        return result;
    }



你可能感兴趣的:(Android)