Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android事件分發機制

Android事件分發機制

編輯:關於Android編程

一、View、ViewGroup的基本屬性 1,View事件:
public boolean dispatchTouchEvent(MotionEvent event)   //事件分發
public boolean onTouchEvent(MotionEvent event)            //事件處理

2,ViewGroup事件
public boolean dispatchTouchEvent(MotionEvent event)   //事件分發
public boolean onTouchEvent(MotionEvent event)            //事件處理
public boolean onInterceptTouchEvent(MotionEvent event) //事件攔截
3,事件響應:
    按下(ACTION_DOWN)
    移動(ACTION_MOVE)
    抬起(ACTION_UP)
    取消(ACTION_CANCEL)
當在“移動事件”中喚醒“取消事件”,就會存在沒有“抬起事件”。【特例】
  4,事件監聽器:
OnClickListener             //點擊事件
OnLongClickListener         //長按事件
OnTouchListener             //觸摸監聽器


二、案例分析

1,EDButton

View類的子類,實現View類的事件分發機制模擬。
/**
 * 功能描述:Button繼承類,重寫事件分發與事件處理【理清事件分發機制】
 * 時間:2016/8/5
 * 作者:vision
 */
public class EDButton extends Button {
    private static final String TAG = "EDButton";
    public EDButton(Context context) {
        super(context);
    }
    public EDButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                System.out.print("EBButton -- dispatchTouchEvent -- ACTION_DOWN");
                Log.i(TAG, "EBButton -- dispatchTouchEvent -- ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                System.out.print("EBButton -- dispatchTouchEvent -- ACTION_UP");
                Log.i(TAG, "EBButton -- dispatchTouchEvent -- ACTION_UP");
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.print("EBButton -- dispatchTouchEvent -- ACTION_MOVE");
                Log.i(TAG, "EBButton -- dispatchTouchEvent -- ACTION_MOVE");
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                System.out.print("EBButton -- onTouchEvent -- ACTION_DOWN");
                Log.i(TAG, "EBButton -- onTouchEvent -- ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                System.out.print("EBButton -- onTouchEvent -- ACTION_UP");
                Log.i(TAG, "EBButton -- onTouchEvent -- ACTION_UP");
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.print("EBButton -- onTouchEvent -- ACTION_MOVE");
                Log.i(TAG, "EBButton -- onTouchEvent -- ACTION_MOVE");
                break;
        }
        return super.onTouchEvent(event);
    }
}
2,EDViewGroup
ViewGroup類的子類實現類,模擬ViewGroup的事件分發機制
/**
 * 功能描述:測試ViewGroup的事件分發
 * 時間:2016/8/8
 * 作者:vision
 */
public class EDViewGroup extends LinearLayout {
    private static final String TAG = "EDViewGroup";

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

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

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                System.out.print("EDViewGroup -- dispatchTouchEvent -- ACTION_DOWN");
                Log.i(TAG, "EDViewGroup -- dispatchTouchEvent -- ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                System.out.print("EDViewGroup -- dispatchTouchEvent -- ACTION_UP");
                Log.i(TAG, "EDViewGroup -- dispatchTouchEvent -- ACTION_UP");
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.print("EDViewGroup -- dispatchTouchEvent -- ACTION_MOVE");
                Log.i(TAG, "EDViewGroup -- dispatchTouchEvent -- ACTION_MOVE");
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                System.out.print("EDViewGroup -- onTouchEvent -- ACTION_DOWN");
                Log.i(TAG, "EDViewGroup -- onTouchEvent -- ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                System.out.print("EDViewGroup -- onTouchEvent -- ACTION_UP");
                Log.i(TAG, "EDViewGroup -- onTouchEvent -- ACTION_UP");
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.print("EDViewGroup -- onTouchEvent -- ACTION_MOVE");
                Log.i(TAG, "EDViewGroup -- onTouchEvent -- ACTION_MOVE");
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                System.out.print("EDViewGroup -- onInterceptTouchEvent -- ACTION_DOWN");
                Log.i(TAG, "EDViewGroup -- onInterceptTouchEvent -- ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                System.out.print("EDViewGroup -- onInterceptTouchEvent -- ACTION_UP");
                Log.i(TAG, "EDViewGroup -- onInterceptTouchEvent -- ACTION_UP");
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.print("EDViewGroup -- onInterceptTouchEvent -- ACTION_MOVE");
                Log.i(TAG, "EDViewGroup -- onInterceptTouchEvent -- ACTION_MOVE");
                break;
        }
//        return super.onInterceptTouchEvent(ev);
        return true;
    }
}
單獨事件分發測試界面展示:
\
結合事件測試界面展示:
\ 3,結果展示:
【1】EDButton事件分發結果
\
\
【2】EDViewGroup事件分發結果
\
\
【3】EDViewGroup結合EDButton --- EDViewGroup不攔截EDButton 事件
onInterceptTouchEvent()返回父類結果,或者false
\
\
【4】EDViewGroup結合EDButton --- EDViewGroup攔截EDButton 事件
onInterceptTouchEvent()返回true
\
\
  三,總結

Android中事件傳遞按照從上到下進行層級傳遞,事件處理從Activity開始到ViewGroup再到View。

View事件傳遞方法包括dispatchTouchEvent、onTouchEvent,表示事件分發,事件處理;

ViewGroup事件傳遞方法包括dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent,

表示事件分發,事件處理,事件攔截。

onTouch事件要先於onClick事件執行,onTouch在事件分發方法dispatchTouchEvent中調用,

而 onClick在事件處理方法onTouchEvent中被調用,onTouchEvent要後於dispatchTouchEvent方法的調用。

事件處理分發,實例實現相對較容易,主要在於邏輯的理解與實現。後續需要從源碼的角度深層次理解相互調用關系。


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