Android 連點二下 (double tap) 觸碰手勢的實作

double tap

觸碰事件可以在兩個地方實作,要偵側連點二下則要加入手勢偵測。

實作觸碰事件

方式一

覆寫 Activity 本身的 onTouchEvent 事件
@Override
public boolean onTouchEvent(MotionEvent event) {
    return super.onTouchEvent(event);
}

方式二

直接實作在 View 本身,這篇的範例是寫在 ImageView:
ImageView imgView = (ImageView)findViewById(R.id.imgView);
imgView.setOnTouchListener(onTouchView);

private OnTouchListener onTouchView = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.d(">>>", "onTouch");
        return true;

        //使用手勢
        //return gestureDetector.onTouchEvent(event);
    } 
};
這時候,imgView 已經可以接收觸碰事件。不過也只有單純的觸碰事件,如果要有像是"連點二下"等等的其他手勢,會無法實現。這時候只要把這個觸碰事件傳給手勢偵聽器即可。將上面的程式碼中的 return true; 移除,並將 return gestureDetector.onTouchEvent(event); 的註解取消。

建立手勢偵測物件

private GestureDetectorCompat gestureDetector; 
//...以下寫在 onCreate() 裡面
gestureDetector = new GestureDetectorCompat(this, new MyGestureListener());
官方文件中,你可以去實作GestureDetector.OnGestureListenerGestureDetector.OnDoubleTapListener 介面,不過因為我只想要"連點二下"的手勢,所以這麼做有點複雜,必須每個手勢方法都去覆寫。這時可以利用另外一個 GestureDetector.SimpleOnGestureListener 類別,它幫你實作了前面提到的兩個介面,但實作的方法內容都是空的,你只要覆寫需要的手勢方法即可。

接下來建立我們的手勢偵測類別:
class MyGestureListener extends GestureDetector.SimpleOnGestureListener{
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.d(">>>", "onDoubleTap");
        return true;
    }
  
    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }
}
一開始我只有覆寫 onDoubleTap,結果沒有反應,後來查了一下才知道,原來 onDown 必須回傳 true 才行。如果需要其他手勢,可以查查 SimpleOnGestureListener 有提供哪些手勢,去覆寫它即可。

參考資料:

本文網址:http://blog.tonycube.com/2014/09/android-double-tap.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。