Android对于用户手势的监听大部分上是通过onTouchEvent方法来实现的,可以说ontouchEvent能处理所有安卓能处理的手势问题,但相对而言较为复杂。Android为广大的开发者提供了一个更为简单的类GestureDetector 在此类中封装了单击、双击、长按、手指滑动和Fling等(不知道该怎么翻译)。至于用法也非常简单如以下代码所示:
private GestureDetector detector=new GestureDetector(context, new MyOnGestureListener());
class MyOnGestureListener extends SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i(getClass().getName(),
"onSingleTapUp-----" + getActionName(e.getAction()));
return false;
}
@Override
public void onLongPress(MotionEvent e) {
Log.i(getClass().getName(),
"onLongPress-----" + getActionName(e.getAction()));
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i(getClass().getName(),
"onScroll-----" + getActionName(e2.getAction()) + ",("
+ e1.getX() + "," + e1.getY() + ") ,(" + e2.getX()
+ "," + e2.getY() + ")");
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(getClass().getName(),
"onFling-----" + getActionName(e2.getAction()) + ",("
+ e1.getX() + "," + e1.getY() + ") ,(" + e2.getX()
+ "," + e2.getY() + ")");
return false;
}
@Override
public void onShowPress(MotionEvent e) {
Log.i(getClass().getName(),
"onShowPress-----" + getActionName(e.getAction()));
}
@Override
public boolean onDown(MotionEvent e) {
Log.i(getClass().getName(),
"onDown-----" + getActionName(e.getAction()));
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.i(getClass().getName(),
"onDoubleTap-----" + getActionName(e.getAction()));
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i(getClass().getName(), "onDoubleTapEvent-----"
+ getActionName(e.getAction()));
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i(getClass().getName(), "onSingleTapConfirmed-----"
+ getActionName(e.getAction()));
return false;
}
}
//如果要为一个控件添加监听时,只需重写onTouch方法即可
@Override
public boolean onTouchEvent(MotionEvent event) {
detector.onTouchEvent(event);
return true;
}
注:
(MotionEvent event)方法中不能写成return detector.onTouchEvent();
onSingleTapUp 在第一次点击事件up时(长按不会触发)触发,但在双击时也会触发
onSingleTapConfirmed 在第一次点击事件的down时(长按不会)触发,但在双击时不会触发。所以用这个方法设置单击监听比较靠谱
onDoubleTap 双击时触发比onDoubleTapEvent先触发,触发时接收到的事件是down第二次点击的时候触发。
onDoubleTapEvent 双击触发,会触发多次能接收到down、move和up,第二次点击时触发
down 用户只要有触摸动作就会触发
onShowPress 需要用户点击后手指在屏幕上停留一段事件(很短),正常的用户点击、滑动等有可能触发也有可能不触发,在触发onLongPress之前一定会触发此事件,再触发此事件之后还能在触发其他事件,接收事件为down
onLongPress 长按事件,接收到的也是down,如果触发了此事件,那在此之前一定会触发onShowPress
onScroll 用户手指在屏幕上滑动时会触发此事件。(但如果用户手指先停留过长触发了onLongPress将不会再接收此事件)此事件能被多次触发,接收事件为move
onFling 用户快速滑动并抬起时会触发此事件,onFling一般伴随着onScroll,并且发生在onScroll结束之后,但并不是所有的 onScroll事件之后都会触发此事件,只会触发一次
构造GestureDetector 传入的第二个参数也可以传入 OnGestureListener的实现类(在不需要处理双击事件的情况下)那么将会少
onDoubleTap, onDoubleTapEvent三个方法。此三个方法来自于GestureDetector中的内部接口 OnDoubleTapListener但不能单独通过此接口来构造GestureDetector