編輯:關於Android編程
所謂的事件分發,其實就是對MotionEvent事件的分發過程,即當一個MotionEvent產生後,系統需要把這個事件傳遞給一個具體的View,而這個傳遞的過程就是分發過程。
點擊事件的分發由3個方法共同完成:
public boolean dispatchTouchEvent(MotionEvent event)
用來進行事件分發,如果事件能傳遞給當前View,那麼此方法一定會被調用,返回結果受View的onTouchEvent 和下級的dispatchTouchEvent方法影響,表示是否消耗當前事件。
public boolean onInterceptTouchEvent(MotionEvent ev)
在上述方法內部調用,用來判斷是否攔截是否攔截某個事件,如果當前View攔截了某個事件,那麼在同一個事件序列中,此方法不會再次調用,返回結果表示是否攔截當前事件
public boolean onTouchEvent(MotionEvent event)
在dispatchTouchEvent 方法中調用,用來處理點擊事件,返回結果是否消耗當前事件,如果不消耗,則在同一個事件序列中,當前View無法再次接受到事件。
對於一個根ViewGroup來說:
產生事件後
首先傳遞它,這時dispatchTouchEvent 會調用ViewGroup的onInterceptTouchEvent
-----ViewGroup的onInterceptTouchEvent返回true就表示攔截當前事件,接著事件會交給ViewGroup處理,即onTouchEvent會被調用
-----ViewGroup的onInterceptTouchEvent返回false表示不攔截事件,這個事件會傳遞給子元素,接著子元素的dispatchTouchEvent會被調用
事件傳遞:activity > Window > view
事件傳遞結論:
1.同一個事件序列是從手指接觸屏幕那一刻開始,到手指離開屏幕那一刻結束。
2.正常情況下,一個事件序列只能被一個View攔截且消耗
3.某個View一旦決定攔截,那麼這個事件序列只能它來處理,它的onInterceptTouchEvent不會再被調用
4.某個View一旦開始,如果它不消耗ACTION_DOWN 事件即onTouchEvent返回來false,那麼同一事件序列中的其它事件都不會再交給它來處理。
5.如果不消耗ACTION_DOWN以外的事件,那麼這個點擊事件會消失,此時父元素的onTouchEvent並不會被調用,並且當前View回持續收到後續事件,最後這些消失的事件會傳遞個給Activity處理
6.ViewGroup默認不攔截事件onInterceptTouchEvent默認返回fakse
7.View 沒有onInterceptTouchEvent,一旦事件傳遞給View,onTouchEvent就會被調用
8.View的onTouchEvent默認消耗事件,返回true,除非它不可點擊 clickable和longClickable同時為false;View的longClickable默認未false,clickable要分情況;
9.View的enable屬性不影響onTouchEvent的默認值返回。
10.onClick 會發生的前提是當前View是可點的,並收到down 和up 事件
11.事件傳遞過程是由外向內的,事件總是先傳遞給父元素再由父元素分發給子元素。
本文實例為大家分享了Android仿微信發表說說、心情功能,供大家參考,具體內容如下既能實現拍照,選圖庫,多圖案上傳的案例,目前好多App都有類似微信朋友圈的功能,能過發
Android自定義DataTimePicker(日期選擇器) 筆者有一段時間沒有發表關於Android的文章了,關於Android自定義組件筆者有好幾篇想跟大家分享的
模式的定義 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 使用場景 用電源接口做例
系統權限 在運行時請求權限系統權限 Android是一個權限分離的操作系統,每個應用使用不同的系統身份運行(Linux用戶ID和群組ID)。系統的不同部分也被分隔進不同