当前位置: 移动互联网学院 > Android开发 > Android View事件分发机制学习笔记
Android View事件分发机制学习笔记 时间:2017-03-21     来源:Android开发学习网

什么是view事件分发机制?

androidView事件分发机制,就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,后被消费的过程。android中view的事件传递是从上往下传递的,即事件总是先传递给父元素,然后父元素在把事件分发给子View。

Android  View事件分发机制
Android  View事件分发机制学习笔记


view事件分发机制详解

事件分发传递过程中有一个很重要的对象:MotionEvent,MotionEvent有个方法getAction,该方法返回int类型,我们可以从该返回值中判断事件类型,典型常见的有以下三种:

ACTION_DOWN:手指刚点击屏幕时

ACTION_MOVE:手指在屏幕上移动

ACTION_UP:手机离开屏幕

还有一种是:ACTION_CANCEL 这个比较少用,这里就不多做介绍了。​​​

我们把从手指触摸到屏幕开始直到手指离开屏幕所产生的​一系列事件叫做同一事件序列,一个事件序列包含一个ACTION_DOWN、若干个ACTION_MOVE、一个ACTION_UP。

事件的分发过程由三个很重要的方法来共同完成的:

1、public boolean dispatchTouchEvent(MotionEvent event)

View的分发事件,一个View只要能接收到事件,首先执行的是该方法,而且该方法是一定会执行​,这里我们就称它为分发事件。

2、public boolean onInterceptTouchEvent​(MotionEvent event)

View的拦截事件,正常情况下dispatchTouchEvent分发事件会调用该方法,该方法的返回值用以判断当前View是否要拦截该事件,返回true,则当前View的onTouchEvent方法将被调用,并且事件不会传递下去。这里我们需要注意一下,如果一个View决定拦截事件,也就是onInterceptTouchEvent返回true,那么在同一个事件序列的其余事件执行过程中并不会在调用该方法。这里我们就称它为拦截事件。

如果一个View(如TextView,直接继承于View而不是ViewGroup,不能添加子View),那么该View是没有onInterceptTouchEvent方法,而且一旦有事件传递给它,onToucheEvent方法将会被调用,除非设置不可点击的(clickable和longClickable同时设为false);​[备注:activity也没有onInterceptTouchEvent事件]

3、public boolean onTouchEvent(MotionEvent event)

View用来处理点击事件,返回值表示当前View是否消费了该事件,如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,而且接收不到下一次事件。换句话说就是:如果没消费,也就是说返回false,那么在同一事件序列的其余事件将不会在传递过来。​

如果一个View设置了onTouchListener事件,那么会先执行onTouchListener,然后根据返回值在判断是否要执行onTouchEvent方法(返回true则不执行onToucheEvent,反之亦然).​​

这里有段伪代码可以把这三个事件的关系表现出来:

public boolean dispatchTouchEvent(MotionEvent event){

boolean consume = false;

if(onInterceptTouchEvent(event)){

consume = onTouchEvent(event);

}​else{

consume = child.dispatchTouchEvent(event);​

}

return consume;​

}​

以上就是对Android View事件分发机制的学习笔记,后续会继续补充相关资料,希望对学习Android开发的朋友们有所帮助!