SimpleOnGestureListener類是GestureDetector提供給我們的一個更方便的響應不同手勢的類,它實現了OnGestureListener,OnDoubleTapListener兩個接口,該類是static class,也就是說它實際上是一個外部類,我們可以在外部繼承這個類,重寫裏面的手勢處理方法。
有些手勢動作我們用不到,但是還要重載。SimpleOnGestureListener類的出現爲我們解決了這個問題,如果你想“Detecting a Subset of Supported Gestures”,SimpleOnGestureListener是最好的選擇。
public class MyGesture extends Activity implements OnTouchListener {
private GestureDetector mGestureDetector;
public MyGesture() {
mGestureDetector = new GestureDetector(new MySimpleGesture());
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setOnTouchListener(this);
tv.setFocusable(true);
tv.setClickable(true);
tv.setLongClickable(true);
}
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.i("MyGesture", "MotionEvent.ACTION_UP");
}
return mGestureDetector.onTouchEvent(event);
}
// SimpleOnGestureListener implements GestureDetector.OnDoubleTapListener, GestureDetector.OnGestureListener
private class MySimpleGesture extends SimpleOnGestureListener {
// 雙擊的第二下Touch down時觸發
public boolean onDoubleTap(MotionEvent e) {
Log.i("MyGesture", "onDoubleTap");
return super.onDoubleTap(e);
}
// 雙擊的第二下Touch down和up都會觸發,可用e.getAction()區分
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i("MyGesture", "onDoubleTapEvent");
return super.onDoubleTapEvent(e);
}
// Touch down時觸發
public boolean onDown(MotionEvent e) {
Log.i("MyGesture", "onDown");
return super.onDown(e);
}
// Touch了滑動一點距離後,up時觸發
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i("MyGesture", "onFling");
return super.onFling(e1, e2, velocityX, velocityY);
}
// Touch了不移動一直Touch down時觸發
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
super.onLongPress(e);
}
// Touch了滑動時觸發
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll");
return super.onScroll(e1, e2, distanceX, distanceY);
}
/*
* Touch了還沒有滑動時觸發
* (1)onDown只要Touch Down一定立刻觸發
* (2)Touch Down後過一會沒有滑動先觸發onShowPress再觸發onLongPress
* So: Touch Down後一直不滑動,onDown -> onShowPress -> onLongPress這個順序觸發。
*/
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
super.onShowPress(e);
}
/*
* 兩個函數都是在Touch Down後又沒有滑動(onScroll),又沒有長按(onLongPress),然後Touch Up時觸發
* 點擊一下非常快的(不滑動)Touch Up: onDown->onSingleTapUp->onSingleTapConfirmed
* 點擊一下稍微慢點的(不滑動)Touch Up: onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
*/
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("MyGesture", "onSingleTapConfirmed");
return super.onSingleTapConfirmed(e);
}
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
return super.onSingleTapUp(e);
}
}
}
就這樣