1.Android View Touch事件組成
(1)事件響應
Android事件分為點擊,長按,拖動,滑動等,狀態主要是由ACTION_DOWN(按下), ACTION_MOVE(移動), ACTION_UP(抬起)組成。事件必須是由ACTION_DOWN觸發,才能有后面一系列的事件響應。
(2)View與ViewGroup有哪些方法響應事件
查看源碼可以知道,View與ViewGroup主要幾個事件組成
View:
public boolean dispatchTouchEvent(MotionEvent event),
public boolean onTouchEvent(MotionEvent event)
ViewGroup:
public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)
public boolean onInterceptTouchEvent(MotionEvent ev)可以看出ViewGroup與View的方法事件不同,ViewGroup多了onInterceptTouchEvent(MotionEvent ev)一個攔截事件。因為LinerLayout,RelativeLayout等容器繼承ViewGroup,可能是因為容器里有各種View,所以ViewGroup可以控制攔截事件。下面說下這幾個事件的作用dispatchTouchEvent(MotionEvent event):負責android view事件分發。onInterceptTouchEvent(MotionEvent ev):負責事件攔截,ViewGroup才有這個事件。onTouchEvent(MotionEvent event):觸摸事件
android 的視圖都繼承View,例如TextView, 所有容器繼承ViewGroup,例如RelativeLayout
2.Android事件傳遞經過哪幾個過程
首先看下ViewGroup源碼,View的事件onTouchEvent(2079行),及ViewGroup的事件onInterceptTouchEvent(2108行)是由ViewGroup的dispatchTouchEvent觸發的。
(1)Activity、View的事件傳遞過程
layout xml
首先自定義View(MyButton)代碼如下
在Activity里實現這幾個事件方法:
點擊按鈕事件打印如下:
由此可以看出事件是從Activity中傳遞到View中。經歷了一個ACTION_DOWN,多個ACTION_MOVE和一個ACTION_UP事件。事件先從activity的dispatchTouchEvent,再到View的dispatchTouchEvent,接著是一系列Activity和View的ACTION_MOVE移動事件。最后到Activity,View的ACTION_UP
(2)Activity、ViewGroup、View的嵌套事件傳遞過程
自定義layout
點擊按鈕事件打印如下:
如圖點擊事件可已看出當View在嵌套view中事件傳遞是從Activity>ViewGroup>View,過程如Activity、View的事件傳遞過程。先down再move最后up的過程。
3.Android事件攔截
Activity的事件分發:
當@return boolean Return true if this event was consumed.>當事件被消耗掉就返回true.下面實驗下:1.當把MyRelativeLayout里的onInterceptTouchEvent返回值改成true,則事件如下:
點擊日志如下:
由此可見:從Activity的dispatchEventTouch到MyRelativeLayout的dispatchTouchEvent>onInterceptTouchEvent>onTouchEvent完全自己消耗了,如果這幾個方法當返回true表示消耗,這時就不會往下傳遞。2.當把MyRelativeLayout里的dispatchTouchEvent返回值改成true,則事件如下:
點擊日志如下:
根據傳遞順序,因為dispatchTouchEvent返回true,所以不會傳遞到onInterceptTouchEvent,效果同上。3.當把MyButton里的dispatchTouchEvent返回值改成true
點擊日志如下:
同上,根據傳遞順序不會往下傳遞。
4.總結
(1)事件傳遞過程是從Activity>PhoneWindow>ViewGroup>View
(2)當非嵌套View的情況下,事件從dispatchTouchEvent>onTouch>onTouchEvent>onClick;當是嵌套View 的情況下,事件是:dispatchTouchEvent>onInterceptTouchEvent(ViewGroup才有)>onTouch>onTouchEvent>onClick。
其中經過dispatchTouchEvent,onTouchEvent,onInterceptTouchEvent,View有前兩個事件,ViewGroup擁有onInterceptTouchEvent,主要負責View的事件的分發,事件的處理,事件的攔截。
(3)Return true if this event was consumed。