Android View事件分发机制学习笔记
来源:Android开发学习网 2017-03-21
什么是view事件分发机制?
androidView事件分发机制,就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,后被消费的过程。android中view的事件传递是从上往下传递的,即事件总是先传递给父元素,然后父元素在把事件分发给子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开发的朋友们有所帮助!
Copyright ©2004-2018 华清远见教育科技集团 版权所有
京ICP备16055225号,京公海网安备11010802025203号