事件分發(fā)分捕獲和執(zhí)行兩個階段
事件傳遞琼开,即捕獲翠语,就是執(zhí)行dispatchTouchEvent()方法嚎杨,再執(zhí)行onInterceptTouchEvent()方法座云。
事件處理就是執(zhí)行onTouchEvent()方法袒炉。
事件的返回值含義:
當事件在傳遞的過程中旁理,返回值:True,攔截我磁,不繼續(xù)孽文;False,不攔截夺艰,繼續(xù)流程芋哭,傳遞給下一級。
當事件在處理的過程中郁副,返回值: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時吸占,繼續(xù)向子View分發(fā)事件,本View只處理ACTION_DOWN事件诫钓。
當onInterceptTouchEvent返回值為true時旬昭,不繼續(xù)向子View分發(fā)事件,本View處理所有事件菌湃。onInterceptTouchEvent(...):
作用:攔截事件问拘,決定是否將事件傳遞給子View;
當返回值為false時惧所,事件繼續(xù)傳遞給子View骤坐;
當返回值為true時,事件交給onTouchEvent(...)處理下愈,不再向子View傳遞纽绍。onTouchEvent(MotionEvent event):
作用:事件最終到這個方法,由此方法處理事件势似;
當返回值為false時拌夏,事件繼續(xù)向上傳遞給其父View的onTouchEvent()方法,直到根View的履因,一直傳遞到根View時障簿,返回值都是false,也就是說在事件傳遞過程中沒有View的onTouchEvent()方法返回true栅迄,此次手勢就會結束站故,此次事件就會被取消。
當返回值為true時毅舆,此View處理所有事件西篓,并且處理的事件不會再向上返回。也就是說在值為true時憋活,此手勢的所有事件都傳遞給此View的onTouchEvent()處理岂津,包括ACTION_DOWN、ACTION_UP悦即、ACTION_MOVE等事件吮成。