Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android事件分發機制完全解析,帶你從源碼的角度徹底理解(上)

Android事件分發機制完全解析,帶你從源碼的角度徹底理解(上)

編輯:Android開發教程

其實我一直准備寫一篇關於Android事件分發機制的文章,從我的第一篇博客開始,就零零散散在好多地 方使用到了Android事件分發的知識。也有好多朋友問過我各種問題,比如:onTouch和onTouchEvent有什麼 區別,又該如何使用?為什麼給ListView引入了一個滑動菜單的功能,ListView就不能滾動了?為什麼圖片 輪播器裡的圖片使用Button而不用ImageView?等等……對於這些問題,我並沒有給出非常詳細的回答,因為 我知道如果想要徹底搞明白這些問題,掌握Android事件分發機制是必不可少的,而Android事件分發機制絕 對不是三言兩語就能說得清的。

在我經過較長時間的籌備之後,終於決定開始寫這樣一篇文章了。目 前雖然網上相關的文章也不少,但我覺得沒有哪篇寫得特別詳細的(也許我還沒有找到),多數文章只是講了 講理論,然後配合demo運行了一下結果。而我准備帶著大家從源碼的角度進行分析,相信大家可以更加深刻 地理解Android事件分發機制。

閱讀源碼講究由淺入深,循序漸進,因此我們也從簡單的開始,本篇 先帶大家探究View的事件分發,下篇再去探究難度更高的ViewGroup的事件分發。

那我們現在就開始 吧!比如說你當前有一個非常簡單的項目,只有一個Activity,並且Activity中只有一個按鈕。你可能已經 知道,如果想要給這個按鈕注冊一個點擊事件,只需要調用:

button.setOnClickListener(new 

OnClickListener() {  
    @Override
    public void onClick(View v) {  
        Log.d("TAG", "onClick execute");  
    }  
});

這樣在onClick方法裡面寫實現,就可以在按鈕被點擊的時候執行。你可能也已經知道,如果想 給這個按鈕再添加一個touch事件,只需要調用:

button.setOnTouchListener(new 

OnTouchListener() {  
    @Override
    public boolean onTouch(View v, MotionEvent event) {  
        Log.d("TAG", "onTouch execute, action " + event.getAction());  
        return false;  
    }  
});

onTouch方法裡能做的事情比onClick要多一些,比如判斷手指按下、抬起、移動等事件。那麼 如果我兩個事件都注冊了,哪一個會先執行呢?我們來試一下就知道了,運行程序點擊按鈕,打印結果如下 :

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

細心的朋友應該可以注意到,onTouch方法是有返回值的,這裡我們返回的是false,如果我們嘗試把 onTouch方法裡的返回值改成true,再運行一次,結果如下:

我們發現,onClick方法不再執行了!為什麼會這樣呢?你可以先理解成onTouch方法返回true就認為這個 事件被onTouch消費掉了,因而不會再繼續向下傳遞。

如果到現在為止,以上的所有知識點你都是清 楚的,那麼說明你對Android事件傳遞的基本用法應該是掌握了。不過別滿足於現狀,讓我們從源碼的角度分 析一下,出現上述現象的原理是什麼。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved