Android中事件触发是由外向内的,返回则是从里向外,今天大概介绍一下事件的分发机制
首先来说一下过程,Android事件分发是由activity-> DecorView->view group->view的过程,主要涉及的方法有
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
事件分发,这个方法主要是起到分发的作用
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
此方法是对事件传递进行拦截,主要是在ViewGroup中才会有,返回true代表不允许事件继续向子View传递,将会触发当前View的onTouchEvent(),进行事件的消费;返回false代表不对事件进行拦截,事件可以传递给子view,默认返回false
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
此方法是触摸事件,参数为手势集合,这里就是监听用户的手势动作,然后回调touchlistener的onTouch方法。如果我们仅仅只是用手指点击按钮,然后马上松开,onTouch事件中只会执行ACTION_DOWN和ACTION_UP动作;如果用手机点击按钮,并且手指还在按钮上滑动了一会儿,那么滑动的过程中,ACTION_MOVE动作就会不停的执行
那么onClick事件又是如何触发的呢,怎么样才能只执行onTouch而不执行onClick呢?
从源码上看,是先执行onTouch,根据用户的手势和返回值来决定是不是要执行onClick事件,也就是说onTouch执行在onClick之前,并且能够影响onClick的执行。
如果只想执行onTouch事件并且不往下分发执行的话,只需要将onTouch方法的返回值改为true,就会只执行onTouch事件,不执行onClick事件
总结 事件传递机制调用顺序:
ViewGroup的事件传递方法:
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
View的事件传递方法:
dispatchTouchEvent
onTouchEvent
只有ViewGroup容器才有onInterceptTouchEvent方法。因为作为最后的子view没必要再拦截了,已经无法继续向下传递事件了,是否拦截已经没有意义了。
网友评论