Touch傳遞
-
Touch
事件先傳遞到Activity
日熬,然后ViewGroup
融欧,再傳遞到View
截汪。 -
Touch
分發(fā)流程 :Activity.dispatchTouchEvent
->ViewGroup.dispatchTouchEvent
ViewGroup.onInterceptTouchEvent
->View.dispatchTouchEvent
->onTouch
->onTouchEvent
->onClick
-
dispatchTouchEvent()
的順序是由上至下的盏浇。onTouchEvent()
是從下到上回溯的.前提是事件沒有被消費(fèi)的情況下璃谨。
ViewGroup和View不同
ViewGroup
沒有重寫onTouchEvent
,重寫了dispatchTouchEvent
匠璧,多了onInterceptTouchEvent
函數(shù)桐款。
onTouch和onClick優(yōu)先級
onTouch()
優(yōu)先級高于onClick()
,若onTouch()
消耗了事件(通常用return true;
表示),則onClick()
不執(zhí)行夷恍。onTouchEvent()
中在ACTION_UP
即手指抬起時(shí)處理點(diǎn)擊onClick()
事件
Clickable和Enable
-
enable
設(shè)置為false
魔眨,onClick()
和onTouch()
等方法完全屏蔽,onTouchEvent()
會被調(diào)用酿雪,但是View
中具體邏輯不執(zhí)行遏暴。 -
enable
可通過設(shè)置boolean
值改變View
的狀態(tài)。 -
setClickListener()
內(nèi)部會設(shè)置setClickable()
為true
指黎,所以最好setClicable()
顯式放在setClickListener()
后面才會生效朋凉。
dispatchTouchEvent事件分發(fā)
- 當(dāng)
dispatchTouchEvent
在進(jìn)行事件分發(fā)的時(shí)候,通常只有前一個(gè)action
返回true
醋安,才會觸發(fā)后一個(gè)action
杂彭。對于dispatchTouchEvent
和onTouchEvent
墓毒,如果View
是可點(diǎn)擊且Enable
為true
,那么onTouchEvent
會默認(rèn)返回true
亲怠。 - 注意:
Button
默認(rèn)Clickable
為true
所计,所以action
事件都會收到,而ImageView
默認(rèn)Clickable
為false
团秽,所以當(dāng)onTouch
返回flase
時(shí)主胧,則不會收到后續(xù)action
事件。
感想
以后盡量看源碼习勤,我有這么時(shí)間看詳解,而且不一定每一篇博客都又詳實(shí)又能滿足我的需要踪栋,都能看源碼看懂了⊥急希看N遍詳解己英,不如看一遍源碼...