標籤:android觸碰 觸碰訊息
前陣子要的工作是給案頭(Launcher啟動器,其實也是一個activity)添加一個觸摸特效(一個View),而這個特效是每次觸碰都會有,不管你在案頭上做什麼操作都會顯示特效!之前一直摸索著不知道如何入手,後來慢慢的實驗之後才知道有個android觸碰訊息傳遞機制。自己摸索的確很慢,要是早點知道這個機制那將會事半功倍。
使用者的每次觸碰(onClick,onLongClick,onScroll,etc.)都是由一個ACTION_DOWN+n個ACTION_MOVE+1個ACTION_UP組成的,使用者觸碰必先有個ACTION_DOWN響應,使用者觸碰結束必然會有個ACTION_UP。(當然如果在途中被攔截,就可能不會有了!)那麼View是如何分發訊息和攔截訊息呢?
1.View及其子類都會有的兩個方法:
public boolean dispatchTouchEvent(MotionEvent ev) 這個方法用來分發TouchEvent
public boolean onTouchEvent(MotionEvent ev) 這個方法用來處理TouchEvent
2.特殊的View子類ViewGroup則還有一個方法:
public boolean onInterceptTouchEvent(MotionEvent ev) 這個方法用來攔截TouchEvent
3.分發
dispatchTouchEvent 收到觸碰,則向最外層的View傳遞訊息,再向子層的View分發
4.攔截:
onInterceptTouchEvent 攔截返回true表示要攔截訊息,不要再向子View傳遞(這裡的子View不是繼承關係,而是包容關係)。返回false則表示不攔截訊息,可以繼續向下一層級的View傳遞訊息,子View將可以dispatchTouchEvent 收到觸碰訊息再分發訊息
5.訊息處理:
onTouchEvent 處理事件,攔截了訊息,或者是最後一個收到訊息的View調用此方法來處理事件,若返回true,則表示正確接收並處理。若返回false則表示沒有被處理,將向父View傳遞(這裡的父View不是繼承關係,而是包容關係)
6.舉例及手稿