【Android】View的事件分发机制

一、MotionEvent事件

手指接触屏幕后所产生的事件,主要有如下几种:
 1、ACTION_DOWN:手指接触屏幕
 2、ACTION_MOVE:手指在屏幕上移动
 3、ACTION_UP:手指从屏幕上松开
通常有如下的一系列事件:
 1、点击屏幕后离开松开,事件序列为DOWN->UP
 2、点击屏幕滑动一会再松开,事件序列为DOWN->MOVE->MOVE->…->MOVE->UP

二、View的事件分发机制

View的事件分发机制其实就是对MotionEvent事件的分发过程,当一个MotionEvent(即点击事件)产生后,需要把这一个事件传递给一个具体的View。点击事件的分发过程由dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法组成:
 1、public boolean dispatchTouchEvent(MotionEvent ev)
 用于处理事件的分发,如果事件传递给当前的view,那么此方法一定会被调用,返回结果受到当前view的onTouchEvent和下级view的dispatchTouchEvent方法的影响,表示是否消耗当前事件。
 2、public boolean onInterceptTouchEvent(MotionEvent ev)
 用来判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列中,此方法不会再次被调用。
 3、public boolean onTouchEvent(MotionEvent ev)
 用于处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则当前view无法再次接受到事件。

上述三个方法的逻辑如下:

public boolean dispatchTouchEvent(MotionEvent ev){
    boolean consume = false;
    if(onInterceptTouchEvent(ev)){    //拦截,当前view处理点击事件
        consume = onTouchEvent(ev);
    } else {                          //不拦截,子view处理点击事件
        consume = child.diapatchTouchEvent(ev);
    }
    return consume;
}

传递流程如下:
(1)事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或者拦截,从最上层的view(viewGroup)开始一直往下(子view)传递。子view可以通过onTouchEvent()对事件进行处理。
(2)事件由父view(viewGroup)传递给子view,viewGroup可以通过onInterceptTouchEvent()对事件进行拦截,停止其往下传递。
(3)如果事件从上往下传递的过程中没有被拦截,最底层的view也没有消耗事件,事件会反向往上传递,这时父view(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()方法中处理。
(4)如果 View 没有对 ACTION_DOWN 进行消费,之后的其他事件不会传递过来。
(5)OnTouchListener 优先于 onTouchEvent()对事件进行消费。
【Android】View的事件分发机制_第1张图片

你可能感兴趣的:(android)