事件分發(fā)分捕獲和執(zhí)行兩個(gè)階段
事件傳遞,即捕獲,就是執(zhí)行dispatchTouchEvent()方法,再執(zhí)行onInterceptTouchEvent()方法。
事件處理就是執(zhí)行onTouchEvent()方法。
事件的返回值含義:
當(dāng)事件在傳遞的過程中,返回值:True,攔截,不繼續(xù);False,不攔截,繼續(xù)流程,傳遞給下一級(jí)。
當(dāng)事件在處理的過程中,返回值:True,處理了,不用審核了;False,交給上一級(jí)處理。
對(duì)于ViewGroup,需要重寫三個(gè)方法:
@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);
}
對(duì)于View,需要重寫如下兩個(gè)方法:
@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攔截處理;
當(dāng)返回super.dispatchTouchEvent(...)時(shí),由onInterceptTouchEvent來決定事件的流向,onInterceptTouchEvent返回值為false時(shí),繼續(xù)向子View分發(fā)事件,本View只處理ACTION_DOWN事件。
當(dāng)onInterceptTouchEvent返回值為true時(shí),不繼續(xù)向子View分發(fā)事件,本View處理所有事件。onInterceptTouchEvent(...):
作用:攔截事件,決定是否將事件傳遞給子View;
當(dāng)返回值為false時(shí),事件繼續(xù)傳遞給子View;
當(dāng)返回值為true時(shí),事件交給onTouchEvent(...)處理,不再向子View傳遞。onTouchEvent(MotionEvent event):
作用:事件最終到這個(gè)方法,由此方法處理事件;
當(dāng)返回值為false時(shí),事件繼續(xù)向上傳遞給其父View的onTouchEvent()方法,直到根View的,一直傳遞到根View時(shí),返回值都是false,也就是說在事件傳遞過程中沒有View的onTouchEvent()方法返回true,此次手勢(shì)就會(huì)結(jié)束,此次事件就會(huì)被取消。
當(dāng)返回值為true時(shí),此View處理所有事件,并且處理的事件不會(huì)再向上返回。也就是說在值為true時(shí),此手勢(shì)的所有事件都傳遞給此View的onTouchEvent()處理,包括ACTION_DOWN、ACTION_UP、ACTION_MOVE等事件。