觸摸反饋應該是自定義view最簡單的部分了,不過內部的原理是比較複雜的,去了解裏面的核心機制,須要本身去閱讀源碼,才能更好理解整個觸摸機制,固然,知其因此然也是遠遠不夠的,下面我就帶你們瞭解自定義view
觸摸機制的難點重點。面試
觸摸反饋就是View對你的用戶的觸摸事件進行自定義,重寫onTouchEvent方法算法
View
的觸摸反饋重寫 onTouchEvent(),在方法內部定製觸摸反饋算法ui
是否消費事件取決於 ACTION_DOWN 事件 或 POINT_DOWN 事件是否返回 爲truespa
MotionEventcode
getActionMasked() 和 getAction()遞歸
POINT_DOWN / POINT_UP 和 getActionIndex()事件
Activity.dispatchEvent()get
Activity.onTouchEvent()源碼
若是設置了 OnTouchListener
,調用 OnTouchListener.onTouch()
it
OnTouchListener
消費了該事件,返回 true
OnTouchListener
沒有消費該事件,繼續調用本身的 onTouchEvent
並返回 和 onTouchEvent
相同的結果若是沒有設置OnTouchListener
,同上
若是是用戶初次按下 (ACTION_DOWN) ,清空TouchTargets 和 DISALLOW_INTERCEPT 標記
看有沒有 TouchTargets
若是是 POINT_UP ,從 TouchTargets 中清除 POINTER 信息;若是 UP 或者 CANCEL 重置狀態
view
是被哪些 pointer
(手指)按下的
Alibaba
面試題: 有一個ViewGroup
, 而後手指頭接觸Button
,手指頭滑開了,滑開又鬆手的過程,整個事件發生了什麼?經歷了什麼?
一開始ViewGroup
會接受到整個事件序列的第一個事件: ACTION_DOWN
,ViewGroup#dispatchTouchEvent
收到ACTION_DOWN
後,
開始詢問 ViewGroup#onInterceptTouchEvent
是否須要攔截,
默認狀況下 ViewGroup#onInterceptTouchEvent
返回false
不攔截,開始向下傳遞ACTION_DOWN
事件,
Buttton#dispatchTouchEvent
收到ACTION_DOWN
詢問onTouchEvent
是否處理,
Button
默認處理,此後的全部事件序列都直接跨過 ViewGroup#onInterceptTouchEvent
的判斷直接傳遞給Button
,
但 ViewGroup#dispatchTouchEvent
會收到全部事件。隨着手指的滑動Button
的座標發生了改變,當手指擡起時觸發 Button#onClick
事件。