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

Android 事件分發機制探析

編輯:關於Android編程

一基礎知識

android的事件處理分為3步。

1)public booleandispatchTouchEvent(MotionEvent ev) 這個方法用來分發TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 這個方法用來攔截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 這個方法用來處理TouchEvent

一個最簡單的屏幕觸摸動作觸發了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

二事件探析

場景:本想實現ttdt那種滑動頁面結束activity的效果,摸索了好久終於實現,流暢效果很滿意,但是activity布局上添加其他控件,比如giriView\listView等,會出現等層自己寫的那個View獲取不到焦點,導致滑動事件失效。

分析:當在頂層View上加其他View,默認情況都是頂層的事件要傳給最上面的view處理,導致為處理情況下,我做的效果失效了;

下圖為一個正常的View點擊效果圖:


\

<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">1、ViewGroup3的dispatchTouchEvent()方法會被調用。

	2、ViewGroup3調用ViewGroup2的dispatchTouchEvent()方法。
	3、ViewGroup2調用ViewGroup1的dispatchTouchEvent()方法。
	4、ViewGroup1會調用View1的dispatchTouchEvent()方法。
	5、View1的dispatchTouchEvent()方法調用自己的onTouchEvent()方法。在onTouchEvent方法中處理點擊事件。處理完了後會返回一個true給調用它的dispatchTouchEvent()方法。
	6、ViewGroup1的dispatchTouchEvent()方法會返回一個true值給ViewGroup2的dispatchTouchEvent()方法。這樣一直將則個true值返回到ViewGroup3的dispatchTouchEvent()方法。ViewGroup3在將這個值返回給調用它的方法。這樣一個事件分發過程結束。
三問題解決
想到這裡,基本上我們就可以利用View的分發攔截機制,將我們需要的Event攔截,不需要的轉發。
在自己寫的view重寫onInterceptTouchEvent()在裡面做下操作:
@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // TODO Auto-generated method stub
        switch (ev.getAction()) {
            case MotionEvent.ACTION_MOVE:
                mLastDownX = (int) ev.getX();
                System.err.println("ACTION_DOWN=" + mLastDownX);
                return true;

        }
        return super.onInterceptTouchEvent(ev);
    }

四驗證效果
運行程序,看效果,完美實現,流暢滑動,可以達到ttdt效果!
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved