[安卓开发日记] View的事件分发
2020-04-14 本文已影响0人
chopperhl
一、dispatchTouchEvent(MotionEvent event)
事件是否向下传递,如果返回true,表示事件会继续向下传递,父View会在后续的MOVE和UP事件继续调用该View的dispatchTouchEvent,一般当前View也会在该方法中调用子View的dispatchTouchEvent。如果返回false,表示事件不会继续向下传递。当前view只会收到ACTION_DOWN的dispatchTouchEvent调用,不会收到后续调用。
非容器的View默认会在该方法中调用onTouchEvent(View 的默认实现)
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
Log.d("VIEW", "DISPATCH --> ACTION_UP");
break;
case MotionEvent.ACTION_DOWN:
Log.d("VIEW", "DISPATCH --> ACTION_DOWN");
break;
case MotionEvent.ACTION_SCROLL:
Log.d("VIEW", "DISPATCH --> ACTION_SCROLL");
break;
case MotionEvent.ACTION_MOVE:
Log.d("VIEW", "DISPATCH --> ACTION_MOVE");
break;
}
return super.dispatchTouchEvent(event);
}
二、onInterceptTouchEvent(MotionEvent e)
是否拦截事件,如果返回true,则不会调用子View的任何onTouchEvent事件(包括ACTION_DOWN),
如果不拦截则事件可以继续向下传递
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
return false;
}
三、onTouchEvent(MotionEvent event)
onTouchEvent从最上层的View开始向父View依次被调用(View的dispatchTouchEvent方法) ,返回false 表示当前view不需要消费事件,会继续调用父View的onTouchEvent方法 ; 返回true表示当前View需要消费事件,父View的onTouchEvent不会再被调用。
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
Log.d("VIEW", "ON_TOUCH --> ACTION_UP");
break;
case MotionEvent.ACTION_DOWN:
Log.d("VIEW", "ON_TOUCH --> ACTION_DOWN");
break;
case MotionEvent.ACTION_SCROLL:
Log.d("VIEW", "ON_TOUCH --> ACTION_SCROLL");
break;
case MotionEvent.ACTION_MOVE:
Log.d("VIEW", "ON_TOUCH --> ACTION_MOVE");
break;
}
return true;
}