Android:深入理解事件分發機制實現原理

一、事件分發機制的基本概念

事件分發機制是指在Android系統中,當用戶對屏幕上的控件進行觸摸操作時,系統會依次把事件傳遞給控件樹上的每個View控件,直到有一個控件成功處理了該事件或者所有控件都未成功處理該事件。

Android的事件分發機制中涉及到三個重要的類:View、ViewGroup和 MotionEvent。View是控件的基類,ViewGroup是可以持有多個子View的View,而MotionEvent則是觸摸事件類。

事件分發機制的核心是ViewGroup.dispatchTouchEvent()方法和View.onTouchEvent()方法。前者是ViewGroup分發事件的方法,後者是View處理事件的方法。

二、事件分發機制的流程

事件分發機制的流程可以描述為:當用戶對屏幕進行觸摸操作後,系統會把該事件交給當前活動的Window對象。Window對象收到事件後會先交給DecorView進行處理。DecorView是Window對象的根View,它是一個FrameLayout,擁有多個子View,即Activity中設置的布局文件。接着DecorView會調用dispatchTouchEvent()方法把事件傳遞給子View,直到有一個子View成功處理了該事件。

當ViewGroup接收到事件時,會先調用自己的onInterceptTouchEvent()方法來詢問是否攔截該事件,如果該方法返回true,則表明該ViewGroup會處理該事件,否則就把該事件交給該ViewGroup的子View進行處理。如果所有的子View都不能處理該事件,則該事件繼續向上層的ViewGroup傳遞,直到確定該事件被處理或者整個控件樹中不存在可以處理該事件的View。

三、事件分發機制的代碼實現

    
        public class MyViewGroup extends ViewGroup {

            public MyViewGroup(Context context) {
                super(context);
            }

            public MyViewGroup(Context context, AttributeSet attrs) {
                super(context, attrs);
            }

            public MyViewGroup(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);
            }

            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {
                // 對子View進行布局
            }

            @Override
            public boolean dispatchTouchEvent(MotionEvent ev) {
                // 進行事件分發
                boolean handled = false;
                if (onInterceptTouchEvent(ev)) {
                    handled = onTouchEvent(ev);
                } else {
                    handled = getChildAt(0).dispatchTouchEvent(ev);
                }
                return handled;
            }

            @Override
            public boolean onInterceptTouchEvent(MotionEvent ev) {
                // 進行事件攔截
                return true;
            }

            @Override
            public boolean onTouchEvent(MotionEvent event) {
                // 處理事件
                return true;
            }
        }
    

四、事件分發機制的注意事項

1、onInterceptTouchEvent()方法可以攔截事件的傳遞,如果該方法返回true,則表明當前ViewGroup會處理該事件;

2、onTouchEvent()方法中必須要調用super.onTouchEvent()方法,否則子View將不會收到觸摸事件;

3、在Activity的布局中,可以使用android:onClick=””屬性來直接綁定點擊事件,也可以調用View的setOnClickListener()方法來動態綁定點擊事件;

4、在處理多點觸摸事件時,必須使用event.getActionMasked()來獲取事件類型,只有event.getAction()可能獲取不到正確的事件類型。

五、事件分發機制的優化

在事件分發機制中,每個View都要進行事件的分發和處理,如果View的層級結構非常複雜,那麼就會導致事件處理過程非常耗費系統資源。

針對這個問題,可以使用一些優化方式來加速事件的分發和處理,例如:

1、對於不需要接收觸摸事件的View,可以設置setClickable(false)或setFocusable(false),這樣可以避免不必要的事件分發;

2、在View的onTouchEvent()方法中,可以進行事件過濾,例如判斷點擊事件是否處於某個範圍內,避免不必要的事件處理;

3、在View的onTouchEvent()方法中,可以進行手勢識別,例如判斷是否有左滑或右滑的動作,從而在系統底層減少事件的發送。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/181847.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-23 06:43
下一篇 2024-11-23 06:43

相關推薦

  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • Spring S_CSRF防護機制實現及應用

    Spring S_CSRF防護機制是Spring Security框架提供的一個針對跨站請求偽造攻擊(CSRF)的保護機制。本文將從以下幾個方面詳細介紹Spring S_CSRF防…

    編程 2025-04-28
  • 抖音外放親媽下葬事件的背後真相

    近期,一段抖音外放親媽下葬的視頻引發廣泛關注和熱議。不少人對這個事件感到震驚和憤怒,認為這種行為非常不尊重親人,觸犯了社會公德和家庭道德。但是,事情真相到底是什麼呢?我們有必要從多…

    編程 2025-04-28
  • GloVe詞向量:從原理到應用

    本文將從多個方面對GloVe詞向量進行詳細的闡述,包括其原理、優缺點、應用以及代碼實現。如果你對詞向量感興趣,那麼這篇文章將會是一次很好的學習體驗。 一、原理 GloVe(Glob…

    編程 2025-04-27
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字符流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27
  • Python的垃圾回收機制

    本文將對Python的垃圾回收機制進行詳細闡述,着重介紹它的基本原理和實現方式。此外,我們還將介紹常見的問題及解決方法,並給出相應的代碼示例。 一、Python的垃圾回收概述 垃圾…

    編程 2025-04-27
  • cc.director.on事件監聽器

    本文將從多個方面詳細介紹Cocos Creator中的cc.director.on事件監聽器。 一、cc.director.on的作用和用法 cc.director.on是Coco…

    編程 2025-04-27
  • 機制與策略分離

    了解機制與策略分離的解決方法與優勢 一、概述 機制與策略分離是一種軟件設計理念,它將複雜的系統、組件等模塊化,通過分離機制與策略,把模塊實現的方式與具體使用方式分開。 機制是實現某…

    編程 2025-04-27

發表回復

登錄後才能評論