您的位置:首页 > 移动开发 > Android开发

Android----View事件分发机制(一)

2017-04-13 16:03 106 查看

首先,当手指接触屏幕时会产生一系列事件(MotionEvent),有下列三种

ACTION_DOWN:手指刚接触屏幕

ACTION_MOVE:手指在屏幕拖动

ACTION_UP:手指离开屏幕

所谓事件分发就是对MotionEvent的分发,从顶层到下层传递给每个View或ViewGroup,分发过程有三个重要方法完成:

public boolean dispatchTouchEvent(MotionEvent ev)

此方法用来对事件进行分发,如果事件能分发到一个View,那么这View的dispatchTouchEvent肯定会被调用

public boolean onInterceptTouchEvent(MotionEvent ev)

ViewGroup才有的方法,判断是否用来拦截某个事件,如果ViewGroup拦截了某个事件,那么同一事件序列的其它事件分发时,此方法不再会被调用(假如拦截了DOWN事件,那么之后的MOVE…MOVE-UP事件到来时此方法都不会调用了,还是会有拦截功能)

public boolean onToutchEvent(MotionEvent ev)

此方法用来对事件进行消费,根据返回的结果判断,True消费,False不消费

说了这么多,可能你会觉得抽象,下面通过代码看下他们三个方法之间的关系,注意:下面贴出ViewGroup的伪代码,主要是帮助你快速理解

public boolean dispatchTouchEvent(MotionEvent ev) {
boolean result = false;
if(onInterceptTouchEvent(ev)){
result = onTouchEvent(ev);
}else {
result = child.onTouchEvent(ev);
}

return result;
}


上面伪代码应该很好理解了,对于一个根ViewGroup,当点击事件发生后首先看下自己需不需要拦截

如果拦截的话就调用onTouchEvent自己先消费了,

如果不拦截的话,就去调用子View的dispatchTouchEvent方法

下面是View的伪代码

public boolean dispatchTouchEvent(MotionEvent ev) {
boolean result = false;
if(onTouchEvent(ev)){
result = true;
}
return result;
}


也很好理解,当ViewGroup把事件分发给子View,子View调用onTouchEvent看是否消费事件,返回True消费,false不消费,如果不消费父ViewGroup继续把点击事件分发给其它子View,如此反复,若所有子View都不消费就父ViewGroup调用自己的onTouchEvent

注意:上面的都是伪代码,只是为了方便理解,实际上我们还要更详细地去了解分发过程,请看下一篇文章Android—-View事件分发机制(二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: