android事件解析

1.Ontouch()事件判斷手指按下、擡起、移動等事件。

onTouch是優先於onClick執行的,並且onTouch執行了兩次,一次是ACTION_DOWN,一次是ACTION_UP(你還可能會有多次ACTION_MOVE的執行,如果你手抖了一下)。因此事件傳遞的順序是先經過onTouch,再傳遞到onClick。

如果onTouch返回true,則onClick事件不執行,onTouch方法返回true就認爲這個事件被onTouch消費掉了,因而不會再繼續向下傳遞。

如果我們在onTouch方法裏返回false,就會再去執行onTouchEvent(event)方法。

onTouchEvent(event)中調用onClick事件

觸摸到了任何一個控件,就一定會調用該控件的dispatchTouchEvent方法

onTouchEvent事件每次點擊它的時候都會觸發一系列的ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件。這裏需要注意,如果你在執行ACTION_DOWN的時候返回了false,後面一系列其它的action就不會再得到執行了。簡單的說,就是當dispatchTouchEvent在進行事件分發的時候,只有前一個action返回true,纔會觸發後一個action。

onTouch和onTouchEvent有什麼區別,又該如何使用?

從源碼中可以看出,這兩個方法都是在View的dispatchTouchEvent中調用的,onTouch優先於onTouchEvent執行。如果在onTouch方法中通過返回true將事件消費掉,onTouchEvent將不會再執行。

另外需要注意的是,onTouch能夠得到執行需要兩個前提條件,第一mOnTouchListener的值不能爲空,第二當前點擊的控件必須是enable的。因此如果你有一個控件是非enable的,那麼給它註冊onTouch事件將永遠得不到執行。對於這一類控件,如果我們想要監聽它的touch事件,就必須通過在該控件中重寫onTouchEvent方法來實現。

事件順序:

dispatchTouchEvent--->onTouch--->onTouchEvent--->onClick


2.ViewGroup就是一組View的集合,它包含很多的子View和子VewGroup,是Android中所有佈局的父類或間接父類,像LinearLayout、RelativeLayout等都是繼承自ViewGroup的。但ViewGroup實際上也是一個View,只不過比起View,它多了可以包含子View和定義佈局參數的功能。

ViewGroup事件順序:

dispatchTouchEvent--->onInterceptTouchEvent--->return true or false?--->

if(true){

 調用ViewGroup的onTouchEvent--->onClick

}else{

  調用孩子View的dispatchTouchEvent--->onTouch--->onTouchEvent--->onClick

}


1. Android事件分發是先傳遞到ViewGroup,再由ViewGroup傳遞到View的。

2. 在ViewGroup中可以通過onInterceptTouchEvent方法對事件傳遞進行攔截,onInterceptTouchEvent方法返回true代表不允許事件繼續向子View傳遞,返回false代表不對事件進行攔截,默認返回false。

3. 子View中如果將傳遞的事件消費掉,ViewGroup中將無法接收到任何事件。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章