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

Android Touch事件分發機制學習

編輯:關於Android編程

Android中的事件分為按鍵事件和觸摸事件。
Touch事件是由一個ACTION_DOWN,n個ACTION_MOVE,一個ACTION_UP組成onClick,onLongClick,onScroll等事件。
Android 中與 Touch 事件相關的方法及其對應的作用:
dispatchTouchEvent(MotionEvent ev) 事件分發
onInterceptTouchEvent(MotionEvent ev) 事件攔截
onTouchEvent(MotionEvent ev) 事件響應

Activity:dispatchTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev)
View: dispatchTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev)
ViewGroup繼承View,上面方法都是public的,所以他擁有上面所有方法,ViewGroup類裡面新添加了方法onInterceptTouchEvent(MotionEvent ev)。

為了比較清楚的了解執行流程,我做了如圖所示的小demo:
這裡寫圖片描述
這裡我們要清楚一個東西,控件分為兩種:一種是繼承View不能包含其他控件的控件;另一種是繼承ViewGroup可以包含其他控件的控件,暫且稱為容器控件,比如ListView,GridView,LinearLayout等。
上面demo的Button就是繼承自View的,淺綠色區域是一個橫向的LinearLayout,而他是繼承自ViewGroup的。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPs/IuMXK9tK7z8JkZW1vtcTWxtf3o7o8YnIgLz4NCsDvw+bT0Mj9uPbA4KO6PGJyIC8+DQpNeUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHk8YnIgLz4NCk15QnV0dG9uIGV4dGVuZHMgQnV0dG9uPGJyIC8+DQpNeUxpbmVhckxheW91dCBleHRlbmRzIExpbmVhckxheW91dDxiciAvPg0K1NpNeUFjdGl2aXR51tCjujwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> public class MyActivity extends Activity { private static final String TAG = MyActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public boolean dispatchTouchEvent(MotionEvent ev) { Log.i(TAG, MotionEvent.actionToString(ev.getAction()) + dispatchTouchEvent()); return super.dispatchTouchEvent(ev); } public boolean onTouchEvent(MotionEvent event) { Log.i(TAG, MotionEvent.actionToString(event.getAction()) + onTouchEvent()); return super.onTouchEvent(event); } }

MyButton和MyLinearLayout十分相似,MyLinearLayout只多了一個onInterceptTouchEvent方法,這裡貼出MyButton的代碼,如果需要MyLinearLayout的代碼可以在後面直接下載,看完整的代碼。
MyButton

public class MyButton extends Button
{
    private static final String TAG = MyButton.class.getSimpleName();

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

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

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }

    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.i(TAG, MotionEvent.actionToString(ev.getAction()) +  dispatchTouchEvent());
        return super.dispatchTouchEvent(ev);
    }

    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, MotionEvent.actionToString(event.getAction()) +  onTouchEvent());
        return super.onTouchEvent(event);
    }
}

Java代碼都是非常簡單的
因為我們要使用自己定義的控件,所以在xml布局代碼中是這樣的:



    

log的顯示為 Tag顯示:具體類, Text顯示:具體動作 + 調用方法名

點擊MyButton(深綠色區域),出現的結果是:
這裡寫圖片描述

點擊MyLinearLayout 非MyButton區域(淺綠色區域),結果是:
這裡寫圖片描述

點擊MyActivity 非MyLinearLayout區域(空白區域),結果是:
這裡寫圖片描述源碼,內部具體到底是怎麼處理的。

 

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