[學習總結]5、Android的ViewGroup中事件的傳遞機制(二)

來源:互聯網
上載者:User

標籤:android   style   blog   class   code   java   

下面是第一篇的串連Android的ViewGroup中事件的傳遞機制(一)

關於onInterceptTouchEvent和onTouchEvent的詳細解釋。

 

 1 public class MainActivity extends Activity { 2     Group1 group1; 3     Group2 group2; 4     MyTextView myTv; 5  6     /** Called when the activity is first created. */ 7     @Override 8     public void onCreate(Bundle savedInstanceState) { 9         super.onCreate(savedInstanceState);10 11         //--group112         //----|13         //-------group214         //---------|15         //------------myTv16 17         group1 = new Group1(this);18         group2 = new Group2(this);19         myTv = new MyTextView(this);20         group2.addView(myTv, new LayoutParams(LayoutParams.FILL_PARENT,21                 LayoutParams.FILL_PARENT));22         group1.addView(group2, new LayoutParams(LayoutParams.FILL_PARENT,23                 LayoutParams.FILL_PARENT));24         setContentView(group1);25     }26 }

 

分別重寫Group1和Group2的onInterceptTouchEvent和onTouchEvent方法,重寫MyTextView的onTouchEvent方法,最終得到的控制項階層如下:

 

1.在預設傳回值情況下logcat輸出如下:

 

 

測試後可知預設情況下和所有方法傳回值為false的結果一致,down事件的捕獲順序onInterceptTouchEvent先於onTouchEvent,由於onTouchEvent傳回值為false,down事件沒被消化,後續的move和up事件沒有出現,同時逆序返回到父控制項的onTouchEvent方法來捕獲,如所示:

 

2.所有onTouchEvent傳回值為true情況下logcat輸出如下

 

輸出結果可以看出子控制項MyTextView消化了down事件,後續的move和up事件正常捕獲,由於down事件被消化,上層的onTouchEvent方法不執行,如所示:(三箭頭分別指down、move、up事件)

 

既然如此,如果MyTextView中onTouchEvent方法返回為false,而group1和group2的onTouchEvent方法返回true的結果自然也就如的順序了:

 

測試輸出結果證明了這一猜測順序,

 

注意:可能有人對這種情況比較疑惑,ACTION_DOWN還好理解,但是ACTION_MOVE為什麼沒有經曆myTv,而且ACTION_MOVE只經曆了group1的onInterceptTouchEvent和group2的onTouchEvent而沒有經曆group2的onInterceptTouchEvent,我開始也費解,後來想想也是,大家對比第1條,由於onTouchEvent返回了false而沒有消耗down事件導致後續的move和up都沒有出現,這裡也是一樣由於myTv中的onTouchEvent返回了false也就是說沒有消耗down事件,那麼後面的move和up也都不會出現在這個view裡面,但是group2截獲到了down事件,但後來的move為什麼group2中的onInterceptTouchEvent沒有執行到呢,原因大家不要忘記了onInterceptTouchEvent的初衷是什麼,返回false是讓它的子view或viewgroup類處理,而group2的子控制項顯然是myTv而myTv的onTouchEvent返回了false也就是接收不到後續的move和up事件,也就沒必要經過onInterceptTouchEvent來繼續分發了(因為分發了也還是接收不到),經過group2的onTouchEvent因為它返回的是true,截獲了事件並且消耗了事件。

 

3.當某個GroupView中的onInterceptTouchEvent方法傳回值為true情況下logcat輸出如下(如group2):

 

 

如果在該方法傳回值中返回true,那麼子控制項將擷取不到任何點擊事件,轉而向自身的onTouchEvent方法轉寄,如所示:

 

如果onTouchEvent方法傳回值都為true,那麼根據規律結果就如順序觸發:

 

最後logcat的結果證實了這一猜測,

 

 

根據這一順序規律我們便可複寫GroupView中的onInterceptTouchEvent來控制事件的響應者。

測試的demo:下載demo

[學習總結]4、Android的ViewGroup中事件的傳遞機制(一)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.