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

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

      Android的各個View之間的關係是一顆樹,下面的子View都是在父View的基礎上創建的,能夠當作子View疊加在父類的View上。下面咱們來看一下兩種不一樣狀況的事件處理。spa

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

                                                         

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

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

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

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

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

若是ACTION_UP事件返回True,表示ACTION_UP接受鬆開操做,鬆開操做停止;View會一直處於按下狀態,以後View便會響應OnLongClick事件。方法

若是ACTION_UP事件返回false,表示ACTION_UP不接收鬆開操做,鬆開操做繼續下發;由於按下與鬆開操做都沒有被停止,因此以後View就會響應OnClick事件。layout

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

           若是有多層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;

相關文章
相關標籤/搜索