学习Android的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群,群号码:364595326 我们一起学Android!
Android中view的事件传递是从上往下传递的,即事件总是先传递给父元素,然后父元素在把事件分发给子View。
事件分发传递过程中有一个很重要的对象:MotionEvent,MotionEvent有个方法getAction,该方法返回int类型,我们可以从该返回值中判断事件类型,典型常见的有以下三种:
ACTION_DOWN:手指刚点击屏幕时
ACTION_MOVE:手指在屏幕上移动
ACTION_UP:手机离开屏幕
我们把从手指触摸到屏幕开始直到手指离开屏幕所产生的一系列事件叫做同一事件序列,一个事件序列包含一个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,反之亦然).
这里有段伪代码可以把这三个事件的关系表现出来(摘自:android开发艺术):
public boolean dispatchTouchEvent(MotionEvent event){
boolean consume = false;
if(onInterceptTouchEvent(event)){
consume = onTouchEvent(event);
}else{
consume = child.dispatchTouchEvent(event);
}
return consume;
}
相信大家都看得很清楚。
学习Android的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群,群号码:364595326 我们一起学Android!
本文出自 “12568240” 博客,谢绝转载!
原文地址:http://12578240.blog.51cto.com/12568240/1898304