回 Android手機程式設計人才培訓班 課程時間表

觸控事件處理(Touch Event)

簡介

在Android內要偵測使用者在觸控螢幕上的動作,例如:點擊,滑動,放開等等,可以透過重載ActivityonTouchEvent()來達到。

加入onTouchEvent()方法

重載一個類別的方法除了直接使用鍵盤輸入之外,你也可以透過Eclipse編輯器來幫你建立重載方法的框架。在你要重載的類別原始碼範圍內任意地方點擊滑鼠右鍵後選擇Source->Override/Implement Methods...選項,接著找出在類別下你要重載的方法,最下面可以決定重載的方法原始碼在類別內位置,確定後點擊「OK」按鈕,Eclipse就會幫你產生出該方法的框架程式碼了。

在類別內點滑鼠右鍵->Source->Override/Implement Methods...
將onTouchEvent方法打勾,並選擇加到原始碼最下面的方法
建立的程式碼如下:
@Override
public boolean onTouchEvent(MotionEvent event) 
{
    // TODO Auto-generated method stub

    return super.onTouchEvent(event);
}

MotionEvent

裡面最重要的就是系統傳遞過來的MotionEvent物件,所有觸控的動作,觸控點的位置,包括多點觸動都是透過該物件。常用的方法如下:
getAction() 取得目前觸控的動作,值有以下:
  • MotionEvent.ACTION_DOWN:開始觸碰
  • MotionEvent.ACTION_UP:結束觸碰
  • MotionEvent.ACTION_MOVE:觸碰移動中
  • MotionEvent.ACTION_CANCEL:觸碰被取消
  • MotionEvent.ACTION_OUTSIDE:觸碰超出了介面的邊界
getActionMasked() 取得目前觸控的動作,多點觸控用,值有以下:
  • MotionEvent.ACTION_DOWN:開始觸碰
  • MotionEvent.ACTION_UP:結束觸碰
  • MotionEvent.ACTION_MOVE:觸碰移動中
  • MotionEvent.ACTION_CANCEL:觸碰被取消
  • MotionEvent.ACTION_OUTSIDE:觸碰超出了介面的邊界
  • MotionEvent.ACTION_POINTER_DOWN:第2點及以後的點開始觸碰
  • MotionEvent.ACTION_POINTER_UP:第2點及以後的點結束觸碰
getX(), getY() 取得觸控事件發生時,手指的座標
getX(index), getY(index) 在多點觸控當中,透過指定觸控點索引值,可以取得該點的座標
getPressure() 在有支援按壓螢幕上可以取得按下的壓力值,按壓的單位取決於該裝置的驅動程式。
getDownTime() 按下開始的時間
getEventTime() 事件結束時間(getDownTime()-getEventTime()可以得到按壓的時間長度)
getPointerCount() 取得目前有幾個點被按壓(也就是有幾個手指按在螢幕上)
getActionIndex() 取得目前MotionEvent為哪一個觸控點發出的
範例程式碼:
@Override
public boolean onTouchEvent(MotionEvent event) 
{
    switch(event.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        Log.d("test", "觸控開始");
        break;
    case MotionEvent.ACTION_UP:
        Log.d("test", "觸控結束");
        break;
    case MotionEvent.ACTION_MOVE:
        Log.d("test", "觸控移動中, x=" + event.getX() + ", y=" + event.getY());
        break;
    case MotionEvent.ACTION_CANCEL:
        Log.d("test", "觸控事件被取消了");
        break;
    case MotionEvent.ACTION_OUTSIDE:
        Log.d("test", "觸控超出螢幕邊界了");
        break;
    }

    return true;
}

注意:

onTouchEvent()的回傳值為super.onTouchEvent(event);父類別方法的時候,會回傳false,代表你沒有處理這個事件,更重要的,這代表你對這個事件和其接下來的相關事件(例如:手勢、滑動、離開觸動)螢幕都沒有興趣,所以你將不會收到接下來的相關事件。所以如果你需要接下來的相關事件,必須改為回傳true。