Android中父View和子view的點選事件的執行過程
Android中的事件型別分為按鍵事件和螢幕觸控事件,Touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的瞭解。
一個最簡單的螢幕觸控動作觸發了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
當螢幕中包含一個ViewGroup,而這個ViewGroup又包含一個子view,這個時候android系統如何處理Touch事件呢?到底是
ViewGroup來處理Touch事件,還是子view來處理Touch事件呢?我只能很肯定的對你說不一定。呵呵,為什麼呢?看看下面我的調查結果你
就明白了。
android系統中的每個View的子類都具有下面三個和TouchEvent處理密切相關的方法:
1)public booleandispatchTouchEvent(MotionEvent ev) 這個方法用來分發TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev)這個方法用來攔截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev)這個方法用來處理TouchEvent
當TouchEvent發生時,首先Activity將TouchEvent傳遞給最頂層的View,
TouchEvent最先到達最頂層 view的 dispatchTouchEvent,然後由 dispatchTouchEvent方法進行分發,
如果dispatchTouchEvent返回true,則交給這個view的onTouchEvent處理,
如果 dispatchTouchEvent返回 false,則交給這個 view的 interceptTouchEvent方法來決定是否要攔截這個事件,
如果 interceptTouchEvent返回 true,也就是攔截掉了,則交給它的onTouchEvent來處理,
如果 interceptTouchEvent返回 false,那麼就傳遞給子 view,由子 view 的dispatchTouchEvent再來開始這個事件的分發。
如果事件傳遞到某一層的子 view的 onTouchEvent上了,這個方法返回了 false,那麼這個事件會從這個 view往上傳遞,都是onTouchEvent來接收。
如果事件傳遞到某一層的子view的onTouchEvent上了,這個方法返回true,那麼這個事件將不會向上傳遞了,由這個view攔截處理.
而如果傳遞到最上面的 onTouchEvent也返回 false的話,這個事件就會“消失”,而且接收不到下一次事件
onInterceptTouchEvent()用於處理事件並改變事件的傳遞方向。處理事件這個不用說了,你在函式內部編寫程式碼處理就可以了。而決定傳遞方向的是返回值,返回為false時事件會傳遞給子控制元件的onInterceptTouchEvent();返回值為true時事件會傳遞給當前控制元件的onTouchEvent(),而不在傳遞給子控制元件,這就是所謂的Intercept(截斷)。
onTouchEvent() 用於處理事件,返回值決定當前控制元件是否消費(consume)了這個事件。可能你要問是否消費了又區別嗎,反正我已經針對事件編寫了處理程式碼?答案是有區別!比如ACTION_MOVE或者ACTION_UP發生的前提是一定曾經發生了ACTION_DOWN,如果你沒有消費ACTION_DOWN,那麼系統會認為ACTION_DOWN沒有發生過,所以ACTION_MOVE或者ACTION_UP就不能被捕獲。
本文源地址:http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html# ,轉載請註明出處!
<com.touchstudy.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.touchstudy.LayoutView2
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<com.touchstudy.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv"
android:text="AB"
android:textSize="40sp"
android:textStyle="bold"
android:background="#FFFFFF"
android:textColor="#0000FF"/>
</com.touchstudy.LayoutView2>
</com.touchstudy.LayoutView1>
在沒有重寫onInterceptTouchEvent()和onTouchEvent()的情況下(他們的返回值都是false), 對上面這個佈局,MotionEvent事件的傳遞順序如下:
當某個控制元件的onInterceptTouchEvent()返回值為true時,就會發生截斷,事件被傳到當前控制元件的onTouchEvent()。如我們將LayoutView2的onInterceptTouchEvent()返回值為true,則傳遞流程變成:
如果我們同時將LayoutView2的onInterceptTouchEvent()和onTouchEvent()設定成true,那麼LayoutView2將消費被傳遞的事件,同時後續事件(如跟著ACTION_DOWN的ACTION_MOVE或者ACTION_UP)會直接傳給LayoutView2的onTouchEvent(),不傳給其他任何控制元件的任何函式。同時傳遞給子空間一個ACTION_CANCEL事件。傳遞流程變成(圖中沒有畫出ACTION_CANCEL事件):
附SDK給出的說明:
相關文章
- [Android]關於Android子view超出父view無法響應點選事件AndroidView事件
- Android中View的測量和佈局過程AndroidView
- Android View的繪製過程AndroidView
- Android View 原始碼解析(三) – View的繪製過程AndroidView原始碼
- Android View 的事件體系AndroidView事件
- Android原始碼完全解析——View的Measure過程Android原始碼View
- View 的繪製過程View
- Android View 的事件體系 -- 事件分發機制AndroidView事件
- framework——View新增過程FrameworkView
- View繪製01-Android渲染系統中的ViewViewAndroid
- vue中在父元件點選按鈕觸發子元件的事件Vue元件事件
- Android自定義View之Window、ViewRootImpl和View的三大流程AndroidView
- Android View 事件分發原始碼分析AndroidView事件原始碼
- Android自定義View:View(二)AndroidView
- Android View 的工作原理AndroidView
- Android —— 自定義View中,你應該知道的知識點AndroidView
- Android View 系統 1 - View樹AndroidView
- Android 自定義View 點贊效果AndroidView
- ABAP webdynpro的view navigation和WebUI的view navigationWebViewNavigationUI
- Android XML佈局報錯:android/view/View$OnUnhandledKeyEventListenerAndroidXMLView
- Android View的工作原理(上)AndroidView
- Android自定義view-自繪ViewAndroidView
- 淺談移動端 View 的顯示過程View
- Android自定義view中,onDraw和onLayout對比AndroidView
- Android 自定義View:處理事件分發(四)AndroidView事件
- ORACLE建庫過程中自動生成的跟鎖相關的VIEWOracleView
- router-view子頁面呼叫父頁面方法更新父頁面引數View
- View Animation 執行原理解析View
- 一張截圖概括父、子、孫元件事件鉤子的執行順序元件事件
- 深入淺出Android系列之從ViewToBitmap延伸到View的繪製全過程AndroidView
- View事件機制分析View事件
- 探究 Android View 繪製流程,Activity 的 View 如何展示到螢幕AndroidView
- Android View post 方法AndroidView
- Android 事件分發機制原始碼解析-view層Android事件原始碼View
- Android自定義View之定點寫文字AndroidView
- 模擬主執行緒等待子執行緒的過程執行緒
- Flutter——原生View的Touch事件分發流程FlutterView事件
- Android自定義View之區塊選擇器AndroidView
- Android View的生命週期詳解AndroidView