1. 程式人生 > >Android 簡述事件分發機制

Android 簡述事件分發機制

1.ViewGroup有三個方法:

Touch 事件相關方法 方法功能 標記
dispatchTouchEvent(MotionEvent ev) 事件分發 1
onInterceptTouchEvent(MotionEvent ev) 事件攔截 2
onTouchEvent(MotionEvent ev) 處理事件 3

這樣,ViewGroup和View對應的方法:

ViewGroup/View 方法
ViewGroup 1、2、3
View 1、3

第一次進入ViewGroup:

  • 走1:

    Return true:停止傳遞,直接走自己的3方法
    False:傳給下一個ViewGroup的1方法
    Return super.dispatchTouchEvent(ev):走自己的2方法—–>

  • 走2:

    True:停止傳遞,走自己的3方法
    False:傳給下一個View的1方法
    Return super.onInterceptTouchEvent(ev):走自己的3方法(與true相同)—–>(預設的是父類攔截)

  • 走3:

    True:自己處理掉事件
    False:事件向上傳遞,由上一級的3處理
    Return super.onTouchEvent(ev):事件向上傳遞,由上一級的3處理(與false相同)—->

  • 事件回傳的時候走的是各自View的3方法:

    true:在當前View消費掉事件
    False:返到上一級,由上一級的onTouchEvent處理—->

上一級返回為true就處理;返回false就接著往上一級傳遞!如果最外層的View沒有處理,事件消失。

如果按住控制元件不放,再移到其它地方,事件就會取消。

對應圖示:

這裡寫圖片描述

2.焦點衝突

比如:ListView條目點選事件,裡面的子view還有點選事件:在item的根節點裡面設定:
android:descendantFocusability=“blocksDescendants”

3.請求父容器不要攔截我的事件:

getParent().requestDisallowInterceptTouchEvent(false);