Android系統中 ViewGroup的子類都具有
//用來分發TouchEvent
public boolean dispatchTouchEvent(MotionEvent ev)
//用來攔截TouchEvent
public boolean onInterceptTouchEvent(MotionEvent ev)
//用來處理TouchEvent
public boolean onTouchEvent(MotionEvent ev)
不是所有的View的子類都需要分發觸摸事件,只有可以往里面添加View控件的才可以。
比如TextView已經是最小的View了,無需進行事件分發,只進行事件處理,所以它沒有dispatchTouchEvent和onInterceptTouchEvent,只有onTouchEvent。
dispatchTouchEvent
僅進行事件的分發、判斷和過濾,會在此方法中的不同時機調用o
onInterceptTouchEvent和onTouchEvent.?
onInterceptTouchEvent
實現這個方法以攔截所有窗口點擊事件
來根據事件的不同對子控件或自身分發事件,覆蓋這個方法時需要注意,它與onTouchEvent有著復雜的關系。
發生MotionEvent.ACTION_DOWN
->false
后續的Move和Up事件會先傳到此ViewGroup,之后才合Down時間一樣傳遞給最終目標(的onTouchEvent處理)。
->true
后續Move和Up事件不會傳給其它ViewGroup,直接和Down時間一起傳遞給此ViewGroup的onTouchEvent處理,子View接收不到任何事件。
如果最終目標view的onTouchEvent返回了
->false
,表示事件并沒有被消耗,該事件會被傳遞到上一層次的View的onTouchEvent進行處理。
->true
,那么后續事件將可以繼續傳遞給該view的onTouchEvent()處理。
1
onInterceptTouchEvent是在ViewGroup里面定義的
2
Android中的layout布局類一般都是繼承此類的
3
onInterceptTouchEvent是用于攔截手勢事件的,每個手勢事件都會先調用onInterceptTouchEvent
onTouchEvent
發生MotionEvent.ACTION_DOWN
->false
不再處理之后的MOVE和UP事件
當我們手指點擊屏幕時候,先調用ACTION_DOWN事件,當onTouch里返回值是true的時 候,onTouch回繼續調用ACTION_UP事件,如果onTouch里返回值是false,那么onTouch只會調用ACTION_DOWN而不 調用ACTION_UP.
常用事件列表
ACTION_DOWN
ACTION_MOVE
ACTION_UP
ACTION_CANCEL
//默認值
1.ViewGroup里的onInterceptTouchEvent默認值是false這樣才能把事件傳給View里的onTouchEvent.
2.ViewGroup里的onTouchEvent默認值是false.
3.View里的onTouchEvent返回默認值是true.這樣才能執行多次touch事件.
View.bringToFront()
ViewGroup通過一個Array保存子View,bringToFront是將子View放在Array的最后,ViewGroup的dispatchDraw是按照從前往后遍歷Array調用drawChild的,所以最后的子View就會顯示在最前面。
View.invalidate()
刷新View,必須在UI線程中調用
把之前舊的view從主UI線程隊列中pop掉
View.postInvalidate()
同View.invalidate(),但是可以在非主線程中調用