觸碰事件可以在兩個地方實作,要偵側連點二下則要加入手勢偵測。
實作觸碰事件
方式一
覆寫 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.OnGestureListener 及 GestureDetector.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://developer.android.com/training/gestures/detector.html
- http://stackoverflow.com/questions/6611044/android-imageview-gesture-doubletap-not-firing
本文網址:http://blog.tonycube.com/2014/09/android-double-tap.html
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。