當(dāng)我們的控件太小,導(dǎo)致我們無法準(zhǔn)確的點(diǎn)擊,這時(shí)候我們可以在在外面再加一層布局,但這樣性能不太好,或者加上padding,但影響這個(gè)UI布局。這時(shí)候我們可以TouchDelegate擴(kuò)大控件的點(diǎn)擊范圍。
我們都知道Android觸屏事件是在視圖樹中傳遞的,ViewGroup決定是否攔截觸屏事件,如果攔截就自己處理,如果不攔截就傳遞給子視圖,子視圖如果是ViewGroup會(huì)經(jīng)歷同樣的邏輯。子視圖是View(這里特指不能包含子視圖的View)就只能在自己的onTouch或者onTocuhEvent中處理,并返回ture或者false來告訴父視圖處理完沒有。
子View處理過程中也有onTouch和onTouchEvent兩個(gè)方法,它們也是有先后順序的,如下代碼,在View.java中的dispatchTouchEvent方法中:

如果View設(shè)置了onTouchListener,那么則先執(zhí)行onTouch方法,如果返回true,上述代碼result就是true,那么onTouchEvent就不會(huì)執(zhí)行,反之,會(huì)繼續(xù)執(zhí)行onTouchEvent。

在onTouchEvent方法中,如果TouchDelegate不為null并且它的onTouchEvent返回true了,那么當(dāng)前的onTouchEvent就返回true,不再執(zhí)行onTouchEvent后續(xù)邏輯。
下面我們看TouchDelegate這個(gè)類源碼:



下面我們用代碼舉例:


可以運(yùn)行驗(yàn)證結(jié)果。