標籤:
一個典型的結構模型
ActivityA包含ViewGroupB,ViewGroupB包含ViewC,這裡選取ViewGroupB(中間節點)作為當前節點視角
過程一:當前節點與父節點的事件關係
ActivityA只關心ViewGroupB.onDispatchTouchEvent傳回值,只要在ACTION_DOWN分發過程中B.onDispatchTouchEvent()返回為true,那麼後續的事件都會向B分發。至於ViewGroupB在onDispatchTouchEvent方法中是怎麼處理的,父節點ActivityA並不會過問。
換句話說,父節點向直接子節點ViewGroupB兜售ACTION_DOWN事件,子節點使用onDispatchTouchEvent方法的傳回值進行應答,只要子節點表示能夠處理ACTION_DOWN,那麼父節點就會將後續事件持續交給子節點。
過程二:當前節點與子節點的事件關係
ViewGroupB從上一級收到ACTION_DOWN事件之後,會調用onInterceptTouchEvent判斷是否進行攔截。如果不攔截,那麼流程與上面的“過程一”一致,如果攔截,那麼ViewGroupB就吃掉事件,直接忽略ViewC。
不過onInterceptTouchEvent屬於內部方法,這個方法本身並不會影響當前節點的onDispatchTouchEvent傳回值。
onDispatchTouchEvent傳回值的判斷
通常情況下,一個節點的onDispatchTouchEvent傳回值只與當前節點的onTouchEvent傳回值和子節點的onDispatchTouchEvent傳回值有關:
this.onDispatchTouchEventValue = child.onDispatchTouchEventValue || this.onTouchEvent
當然,也可以強制給onDispatchTouchEvent賦一個傳回值,儘管如此,也不應該強制拋棄原有的事件機制,因為原有的事件機制會進行一些狀態清理等操作。
ACTION_DOWN樣本圖:
Android分享 Q群:315658668
【Android】觸屏事件傳遞簡述