手势识别器-GestureDetector

常用方法

GestureDetector有两个重要的接口和一个外部类。

  • android.view.GestureDetector.OnGestureListener
  • android.view.GestureDetector.OnDoubleTapListener
  • GestureDetector.SimpleOnGestureListener

其中SimpleOnGestureListener 包含了两个接口的实现

GestureDetector.OnGestureListener

该接口方法讲解:
onDown:用户按下屏幕就会触发该函数
onSingleTapUp:单击事件
onShowPress:用户按下超过瞬时就会触发该函数
onScroll:拖动事件。完成后会调用onFling
onFling:滑屏,用户按下触摸屏,以很快速度滑动。
onLongPress:长按,超过一定时长就会触发该函数

手势触发顺序

  • 长按手势触发顺序:

    • onDown->onShowPress->onLongPress
  • 单击事件不滑动,手势触发的顺序

    • onDown->onSingleTapUp->onSingleTapConfirmed
  • 单击事件,稍慢抬起来事件

    • onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
  • 滑屏幕事件,稍微滑动

    • onDown->onScroll->onScroll->。。。。。->onFling
  • 滑屏幕事件,拖动

    • onDown->onScroll->onScroll->onFling
      可以看到,滑屏幕和轻微拖动屏幕只会影响onScroll事件数量而已。

使用GestureDetector

1, 创建监听函数。
new android.view.GestureDetector.OnGestureListener()
2.创建GestureDetector
GestureDetector mGestureDetector = new GestureDetector(new MyGestureDetectorListener());
3.在onTouch中拦截,下面方法选其中一个

下面方法需要实现OnTouchListener接口,并调用setOnTouchListener 接口。可以在任意位置设置
@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}
下面方法不需要实现OnTouchListener接口,在自定义控件中实现。
@Override
public boolean onTouchEvent(MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}

4, 绑定事件。

view.setOnTouchListener(this);
view.setFocusable(true);
view.setClickable(true);
view.setLongClickable(true);

OnDoubleTapListener

方法讲解

onSingleTapConfirmed : 单击事件,触发顺序为:onDown->onSingleTapUp->onSingleTapConfirmed

onSingleTapUp于onSingleTapConfirmed区别在于,onSingleTapConfirmed双击不会触发,onSingleTapUp只要抬起手指就会触发

onDoubleTap :双击事件
onDoubleTapEvent:双击中间隔发生的动作

SimpleOnGestureListener实现类

该实现类默认实现了OnDoubleTapListener和OnGestureListener两个接口的空实现。

onFling用法 - 判断向左向右滑动:

基本示例

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    if (e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 200) {
        Log.e("appDebug", "向左");
    } else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 200) {
        Log.e("appDebug", "向右");
    }
    return super.onFling(e1, e2, velocityX, velocityY);
}

e1 : 第一个按下位置
e2:最后一个move事件位置
velocity :移动速度,单位为像素/秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值