事件分发分捕获和执行两个阶段
事件传递,即捕获,就是执行dispatchTouchEvent()方法,再执行onInterceptTouchEvent()方法。
事件处理就是执行onTouchEvent()方法。
事件的返回值含义:
当事件在传递的过程中,返回值:True,拦截,不继续;False,不拦截,继续流程,传递给下一级。
当事件在处理的过程中,返回值:True,处理了,不用审核了;False,交给上一级处理。
对于ViewGroup,需要重写三个方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
Log.d(TAG, "ViewGroup dispatchTouchEvent" + event.getAction());
return super.dispatchTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
Log.d(TAG, "ViewGroup onInterceptTouchEvent" + event.getAction());
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
Log.d(TAG, "ViewGroup onTouchEvent" + event.getAction());
return super.onTouchEvent(event);
}
对于View,需要重写如下两个方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
Log.d(TAG, "View dispatchTouchEvent" + event.getAction());
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
Log.d(TAG, "View onTouchEvent" + event.getAction());
return super.onTouchEvent(event);
}
-
dispatchTouchEvent(...):
作用:决定事件是否由onInterceptTouchEvent拦截处理;
当返回super.dispatchTouchEvent(...)时,由onInterceptTouchEvent来决定事件的流向,onInterceptTouchEvent返回值为false时,继续向子View分发事件,本View只处理ACTION_DOWN事件。
当onInterceptTouchEvent返回值为true时,不继续向子View分发事件,本View处理所有事件。 -
onInterceptTouchEvent(...):
作用:拦截事件,决定是否将事件传递给子View;
当返回值为false时,事件继续传递给子View;
当返回值为true时,事件交给onTouchEvent(...)处理,不再向子View传递。 -
onTouchEvent(MotionEvent event):
作用:事件最终到这个方法,由此方法处理事件;
当返回值为false时,事件继续向上传递给其父View的onTouchEvent()方法,直到根View的,一直传递到根View时,返回值都是false,也就是说在事件传递过程中没有View的onTouchEvent()方法返回true,此次手势就会结束,此次事件就会被取消。
当返回值为true时,此View处理所有事件,并且处理的事件不会再向上返回。也就是说在值为true时,此手势的所有事件都传递给此View的onTouchEvent()处理,包括ACTION_DOWN、ACTION_UP、ACTION_MOVE等事件。
网友评论