最近因為答辯,需要整理一下觸摸事件。
但是關于Down事件,它是一個觸摸動作的起始,它的處理和對其他事件的處理在細節上是有不同的,總覺得邏輯有些凌亂,所以寫個demo幫助理解一下。
首先是自定義View,父View繼承了LinearLayout,子View繼承TextView,簡單覆寫了兩者的觸摸方法,加了Log方便觀察。
1.子View和父View的onTouchEvent方法相同:
都是返回super.onTouchEvent(event):
此時觸摸TextView,Log是長這樣的:
此時,LinearLayout的onTouchEvent,onInterceptTouchEvent,以及TextView的onTouchEvent返回的都是false。
2.在1的基礎上,
將TextView的onTouchEvent改為true。
返回的Log:
3.在1基礎上,將LinearLayout的onTouchEvent改為true,
TextView的onTouchEvent改為false。
返回的Log:
4.在1基礎上,
將LinearLayout的onTouchEvent改為true
將TextView的onTouchEvent改為true。
結果和2一致。
5.在1的基礎上,
將LinearLayout的dispatchTouchEvent改為只攔截Down事件,且
onTouchEvent事件返回true.
將TextView的onTouchEvent改為true。
結果長這樣:
6.在1基礎上,
將LinearLayout的dispatchTouchEvent改為只不攔截Down事件,且
onTouchEvent事件返回true.
將TextView的onTouchEvent改為true。
7.在1基礎上,
將LinearLayout的dispatchTouchEvent改為只攔截Down事件,且
onTouchEvent事件返回false.
將TextView的onTouchEvent改為true。
8.在1基礎上,
將LinearLayout的dispatchTouchEvent改為只不攔截Down事件,且
onTouchEvent事件返回false.
將TextView的onTouchEvent改為true。
綜上:
對于ViewGroup,也就是父View,如果在onTouchEvent中對于Down屬性的事件的返回值:
true:該事件被消費,之后的move,up不經過它自身的intercept判斷,直接進入它的onTouchEvent被處理。
false:沒有消費down事件,之后的move,up需要經過自身的intercept,攔截。對于View,也就是子View,如果在onTouchEvent中對于Down屬性的事件的返回值:
true:該事件被消費,之后的Move,Up仍然要經過它的父View的intercept方法判斷,如果被父View劫走,它將收到到一個Cancel事件。
false:只要沒有消費該Down事件,之后的Move和Up就真的說再見了,直到下一個Down事件來臨。