【Android】Touch事件分发
題外話:
/*** A ViewGroup is a special view that can contain other views* (called children.) The view group is the base class for layouts and views* containers. This class also defines the* android.view.ViewGroup.LayoutParams class which serves as the base* class for layouts parameters.一個ViewGroup是一個可以包含其他view的特別的View(是View的子類),ViewGroup是各個Layout和View組件的基類,這個類還定義了LayoutParams類來指定這個基類的布局參數。
?
正題:
之所以先了解一下ViewGroup,是因為ViewGroup是了解一個界面組織的基本元素,只有知道這個元素,我們才好描述Touch事件的分發。關于Touch事件的分發,很多人都做過研究,比如Android中OnTouch事件的研究:
在觸發OnTouch事件的時候Android的GroupView會調用如下三個函數:
1 public boolean dispatchTouchEvent(MotionEvent ev) 用于事件的分發 2 public boolean onInterceptTouchEvent(MotionEvent ev) 用于事件的攔截 3 public boolean onTouchEvent(MotionEvent ev) 處理事件當然我們可以在容器類中如繼承自LinearLayout的類中重寫這三個方法。而繼承View類的子類只能重寫dispatch和onTouchEvent兩個方法。當點擊后這三個方法相繼執行。
自己寫了一個TextView子類MyTextView和LinearLayout子類MyLinearLayout,TextView包含在LinearLayout中。
當點擊MyTextView時,程序會先進入到LinearLayout的dispatchTouchEvent中,這個類必須調用super.dispatchTouchEvent(ev);?否在后面的兩個方法無法觸發,所以傻蛋發現這個方法根本沒有必要重寫,因為框架是在super.dispatchTouchEvent(ev);中來調用onInterceptTouchEvent和onTouchEvent方法的,所以手動的設置dispatchTouchEvent的返回值是無效的,除非你不想讓框架觸發這兩個方法。
? ? ?當執行完dispathTouchEvent后會執行onInterception方法,如果返回為true,這表示MyLinearLayout把這個Touch事件攔截了,就會執行自己的OnTouch方法。如果為false則表示不攔截,此事件會分發到把事件傳遞給它的子控件MyTextView中。
? ? ?當事件傳遞到MyTextView后,會執行dispatchTouchEvent,然后會執行onTouchEvent。當在MyTextView中的onTouchEvent返回為false的話,當執行完onTouchEvent中的事件后,事件會再分發給MyLinearLaytout,執行LinearLayout的onTouchEvent。
博客作者(傻蛋?)使用一個LinearLayout和一個TextView來做實驗,我們可以得出如下的結論:
1)事件的初始觸發者是父組件(LinearLayout),父組件有權決定是分發這個事件還是攔截這個事件;
2)如果父組件分發這個事件,則子控件會收到這個事件,子控件調用onTouchEvent方法處理事件,如果onTouchEvent返回的是false,則事件還會交給父組件處理。
總結論是:
Android的觸摸事件分發是從最上層的Activity開始的,然后dispatch到子View,當分發到觸發事件的View時,再逐層往回調用onTouchEvent函數,下面是實例代碼。
更明白一點:
Android 消息隊列的分發流程是:Activity? ->? ViewGroup1? -> ViewGroup1的直接子ViewGroup –> ××××××? -> 葉子View
消息處理流程,從子到父,如果消息處理一直返回的是 false。則一直是從子到父的依次處理。處理到沒有可以處理的人了,或者返回了true到此為止。
(還需要繼續,自己實驗,自己研究源碼)
轉載于:https://www.cnblogs.com/lqminn/archive/2012/09/25/2701171.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Android】Touch事件分发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: viewDidUnload 和 deal
- 下一篇: sqlserver Conversion