Android事件分發機制 [復制鏈接]

2018-10-11 10:22
James1991 閱讀:633 評論:0 贊:0
Tag:  

在平時的工作中,事件分發機制是非常重要的,之前雖然說比較了解,出現問題也能得到解決,但是一直沒有系統的總結一下,有些地方也不能一句話說死,今天得空簡單的總結記錄如下:

相關類及方法

??? ?這里寫圖片描述

重要方法的作用

??dispatchTouchEvent():此方法是View中定義的,ViewGroup重寫了它。View中dispatchTouchEvent()將事件交給OnTouchListener處理,并調用onTouchEvent(),這些都是讓控件自己處理事件;而ViewGroup中dispatchTouchEvent()是將事件分發給他的子控件處理,如果子控件沒有消費掉事件,然后再自己處理,自己處理的方式跟View中一樣(最后調用的是super.dispatchTouchEvent() )

??onInterceptTouchEvent(ev): ViewGroup的方法,是否攔截事件,如果返回true,則子控件無法獲得事件
??setOnTouchListener(): View中的方法,設置Touch監聽,回調onTouch()方法
??onTouchEvent(): View中的方法,解析處理事件
??setOnClickListener(): View中的方法,設置點擊事件,回調onClick()方法

方法調用圖

??? ?

分析

??Android事件的傳遞是從外層控件傳遞到內層控件(父控件傳子控件)的,屏幕收到事件后首先傳遞給最外層的容器,調用它的dispatchTouchEvent()方法,dispatchTouchEvent()是View中的方法,ViewGroup重寫了它。

??ViewGroup的dispatchTouchEvent()首先判斷事件攔截是否被禁用掉了(通過disallowIntercept,此值默認是false,可以通過requestDisallowInterceptTouchEvent()設置),如果沒被禁用,則會調用onInterceptTouchEvent()判斷事件是否被攔截。如果外層控件的onInterceptTouchEvent()返回true,事件則不會繼續往下傳遞,如果返回false(和不禁用一樣)則事件不會被攔截,會遍歷它的子控件,判斷觸摸點是否在子控件范圍內。

??①、如果在,就會調用子控件的dispatchTouchEvent(),子控件如果是容器又會重復上面步驟,如果不是容器,就會執行View的dispatchTouchEvent(),下面插播View的dispatchTouchEvent()分析:

??View對dispatchTouchEvent()的實現判斷控件是否可用(enable)&& 是否設置了OnTouchListener,如果為true會調用監聽的onTouch(),onTouch()如果返回false,說明事件沒有被消費掉,會繼續調用onTouchEvent()方法。

public boolean dispatchTouchEvent(MotionEvent event) {
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
            mOnTouchListener.onTouch(this, event)) {
        return true;
    }
    return onTouchEvent(event);
}

??onTouchEvent():該方法會解析一系列的ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件(按下、滑動、抬起等),在ACTION_UP時會調用performClick()方法,該方法判斷有沒有setOnClickListener,如果設置了就會回調onClick()方法。這個方法也有返回值,如果在某個action返回了false,則后面就不會再執行該方法了(收不到事件了)。

??如果子控件可點擊或者需要接受事件,onTouchEvent()一定會返回true,這樣在ViewGroup的dispatchTouchEvent()中收到子控件的返回值后也繼續返回true,事件到此終止。

??②、如果不在任何子控件范圍內(點擊空白處),或者子控件沒有處理掉事件(dispatchTouchEvent()返回false),則ViewGroupdispatchTouchEvent()會繼續往下執行調用super.dispatchTouchEvent()(View中的dispatchTouchEvent()),這也就是ViewGroup自己處理事件

????


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

两码中特期期