android對OnTouchListener、OnClickListener等事件響應的研究(轉)

 前幾天遇到一個小問題,就是給listview添加onItemClickListener、onItemLongClickListener、onTouchEvent三種事件的 時候,只執行了onTouchEvent事件,而其他的兩個事件未執行,解決辦法:在對應的onTouchEvent的action裏面設置return false;當執行到該action的時候就會返回false,前兩個事件就會執行了。解決方法很簡單,爲此還特意研究了一下View對事件響應的流程。

      Android的各個View之間的關係是一顆樹,下面的子View都是在父View的基礎上建立的,可以看成子View疊加在父類的View上。下面我們來看一下兩種不同情況的事件處理。

      1、給同一個View設置了OnTouchEvent事件、OnClickListener事件與OnLongClickListener事件,當點擊View的時候,事件的響應順序是:

                                                         

Touch事件的ACTION_DOWN ->  ACTION_UP  ->  OnClick/OnLongClick。

          該View是怎麼響應這個點擊動作的呢?

          首先,該View會先響應ACTION_DOWN事件,並返回一個boolean值,這裏有兩種判斷:

                a:返回True,表示該View接受此按下動作,就是說這個點擊動作的按下操作被中止,然後就是響應ACTION_UP事件。點擊動作的按下操作被ACTION_DOWN接受之後就結束了,所以之後的OnClick/OnLongClick事件就不會響應了。

                b:返回false,表示該View不接受此按下動作,響應完之後,按下操作繼續往下發,之後是響應ACTION_UP事件,這裏又有一個判斷:

如果ACTION_UP事件返回True,表示ACTION_UP接受鬆開操作,鬆開操作中止;View會一直處於按下狀態,之後View便會響應OnLongClick事件。

如果ACTION_UP事件返回false,表示ACTION_UP不接收鬆開操作,鬆開操作繼續下發;因爲按下與鬆開操作都沒有被中止,所以之後View就會響應OnClick事件。

      2、多個View之間的事件響應:

           如果有多層View,一個layout佈局,在此佈局上放一個TextView,並將TextView的寬高設置爲fill_parent(確保點擊的是在TextVIew上)。給Activity與TextView都設置OnTouchListener事件。事件響應的順序是先從頂層的View開始的。所以,當點擊屏幕時(TextView所在區域的屏幕)。

          TextView響應ACTION_DOWN,返回false,ACTION_DOWN繼續下發,Activity響應ACTION_DOWN事件。如果返回true,表示ACTION_DOWN到TextView就被中止了,而不會繼續往下被Activity捕獲了。

           ACTION_UP的響應方式有點不同,響應ACTION_UP的有兩種條件,必須滿足其一:

           a、最下面一層(此處是Activity)。

           b、其對應的ACTION_DOWN是終止點,即其ACTION_DOWN的返回值爲true;

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