1. 程式人生 > >Android:Touch事件攔截機制

Android:Touch事件攔截機制

道長說了這麼多自定義View,還沒說自定義View會遇到什麼問題,其實這個問題不止在自定義View中存在。在開發中遇到控制元件巢狀,堆疊都會出現,比如:點選子控制元件,子控制元件接收不到點選事件等等。這裡道長簡單說一下Android的事件攔截機制。重點是記錄一下道長的想法。這裡有大牛寫的更詳細更深入,想看的話可以點選傳送門:android事件攔截處理機制詳解

  • View佈局
    這裡寫圖片描述

  • 控制元件方法
    手機當前介面為Activity,在當前介面中有ViewGrouopA控制元件及其子控制元件ViewGroupB,ViewGroupB的子控制元件View。
    在ViewGroupA/ViewGroupB中都有方法dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent()方法,在Activity/view中只有dispatchTouchEvent()與onTouchEvent()方法。

    dispatchTouchEvent(MotionEvent ev)  -  用於Touch事件的分發
    onInterceptTouchEvent(MotionEvent ev)  -  用於攔截Touch事件
    onTouchEvent(MotionEvent event)  -  用於處理Touch事件
    
  • 事件傳遞
    1.當手機介面有觸控事件MotionEvent發生down動作時
    分發判斷:會先把事件傳遞給Activity,先呼叫dispatchTouchEvent()方法將事件傳遞給子控制元件ViewGroupA。
    2.ViewGroupA接收到事件
    分發判斷

    :先呼叫dispatchTouchEvent()方法,再呼叫onInterceptTouchEvent()方法判斷是否攔截事件。如果onInterceptTouchEvent()方法返回的是true;就呼叫onTouchEvent()方法消費掉該事件。如果onInterceptTouchEvent()方法返回的是false,就將事件傳遞給子控制元件ViewGroup。
    3.ViewGroupB接收到事件
    分發判斷:先呼叫dispatchTouchEvent()方法,再呼叫oninterceptTouchEvent()方法判斷是否攔截事件。如果onInterceptTouchEvent()方法返回的是true;就呼叫onTouchEvent()方法消費掉該事件。如果onInterceptTouchEvent()方法返回的是false,就將事件傳遞給子控制元件View。
    4.View接收到事件
    分發判斷
    :先呼叫dispatchTouchEvent()方法,然後直接呼叫onTouchEvent()方法處理事件。如果onTouchEvent()方法返回的是true,表示消費了事件;如果返回的是false,表示不需要這個事件,對這個事件不進行任何處理。將這個事件返回到呼叫處View控制元件的dispatchTouchEvent()方法,再由dispatchTouchEvent()方法把事件返回到父控制元件ViewGroupB。
    5.ViewGroupB直接呼叫onTouchEvent()方法處理事件
    返回判斷:如果onTouchEvent()方法返回的是true,表示消費了事件;如果返回的是false,表示不需要這個事件,對這個事件不進行任何處理。將這個事件由dispatchTouchEvent()方法把事件返回到父控制元件ViewGroupA。
    6.ViewGroupA直接呼叫onTouchEvent()方法處理事件
    返回判斷:如果onTouchEvent()方法返回的是true,表示消費了事件;如果返回的是false,表示不需要這個事件,對這個事件不進行任何處理。將這個事件由dispatchTouchEvent()方法把事件返回到Activity。
    7.Activity直接呼叫onTouchEvent()方法處理事件
    返回判斷:如果onTouchEvent()方法返回的是true,表示消費了事件;如果返回的是false,表示不需要這個事件,對這個事件不進行任何處理,事件丟失。

  • 示意圖
    這裡寫圖片描述

關於Android事件攔截機制道長就先記錄到這裡,以後有了新的想法在記錄。希望這篇部落格能夠為你提供一些幫助。