android開發藝術探索

高平後生發表於2016-11-02

1.View有兩個方法用來響應使用者的觸控事件,dispatchTouchEvent()和onTouchEvent().因為View本身就是一個觸控事件的最後響應Target,所以它沒有ViewGroup的onInterceptTouchEvent()方法。(順便提一下ViewGroup的onInterceptTouchEvent()方法,預設都是返回false,不攔截事件).

2.那麼,View中OnClickListener的onClick方法什麼時候被呼叫?我們先從View分發事件的dispatchTouchEvent方法看,



接著看22行到33行的一段邏輯,發現onTouchEvent()方法是在dispatchTouchEvent()方法中呼叫的,在第27行用到了OnTouchListener的onTouch()方法的返回值,而在第30行呼叫了onTouchEvent()方法,可以看出onTouch方法的返回值直接決定result的值,而result的值又決定了onTouchEvent方法是否會執行。從而得到結論:onTouch()必須方法返回true的時候,result才能為true,而在result為true的時候onTouchEvent方法是不會執行的,onTouch方法返回false的時候,result肯定是false,這個時候onTouchEvent方法才會執行。

2.然後再來看onTouchEvent()方法:


可以看到在在使用者將手指離開螢幕的時候,也就是ACTION_UP的邏輯當中進行了一系列判斷操作,最終呼叫了一個performClick()方法,看下這個方法程式碼:



看下注釋: Call the View's OnClickListener, if it is defined. 解釋的多好。明確的在裡面呼叫了OnClickListener的OnClick()方法。其實在自己程式碼中也可以直接呼叫這個方法來模擬一次View的點選事件。

至此,View的OnClickListener方法呼叫流程基本明確了,就是在OnTouchEvent方法中的ACTION_UP中,呼叫了OnClick方法,需要注意的是:如果View設定了OnTouchListener並且在onTouch方法返回true,那麼onTouchEvent方法不會執行,onClick方法也不會被呼叫。

問:那麼還有別的地方會呼叫onClickListener的onClick()方法嗎?

答:有!

全域性搜尋一下,還有一個callOnclick方法也呼叫了onClick()方法,但是這個方法並沒有在事件的分發過程中被呼叫,不作考慮。



相關文章