触摸[7] GestureDetector

【参考链接】

用户手势检测-GestureDetector使用详解http://blog.csdn.net/harvic880925/article/details/39520901

 

GestureDetector相关的有两个接口和一个外部类

接口:OnGestureListenerOnDoubleTapListener

内部类:SimpleOnGestureListener

他们之间的关系为

创建GestureDetector对象需要传递OnGestureListener接口

然后还可以给GestureDetector对象设置OnDoubleTapListener接口

SimpleOnGestureListner其实就是这两个接口的函数的集合,实现了这两个接口并默认实现为空,让我们可以根据需要重写方法。

 

使用方式为

创建GestureDetector对象,并在onTouchEvent()/onTouchListener中接收MotionEvent进行处理

        //对于先发生longPress再发生fling的情况

        //不加只触发longPress()

        //加上下面这一句只触发fling()

        mGestureDetector.setIsLongpressEnabled(false);

    }



    @Override

    public boolean onTouchEvent(MotionEvent event) {



        super.onTouchEvent(event);



        //先做一些自己的处理

        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                Log.e("shadowfaxghh", "ACTION_DOWN");

                obtaionVelocityTracker();

                mVelocityTracker.addMovement(event);

                break;



            case MotionEvent.ACTION_MOVE:

                Log.e("shadowfaxghh", "ACTION_MOVE");

                obtaionVelocityTracker();

                mVelocityTracker.addMovement(event);

                break;



            case MotionEvent.ACTION_UP:

                Log.e("shadowfaxghh", "ACTION_UP");

                if (mVelocityTracker != null) {

                    //计算速度

                    mVelocityTracker.computeCurrentVelocity(1000, scaledMaximumFlingVelocity);



                    //获取x方向的速度

                    int xVelocity = (int) mVelocityTracker.getXVelocity();

                    Log.e("shadowfaxghh", "xVelocity=" + xVelocity);



                    recycleVelocityTracker();

                }

                break;



            case MotionEvent.ACTION_CANCEL:

                Log.e("shadowfaxghh", "ACTION_CANCEL");

                recycleVelocityTracker();

                break;



            default:

                break;

        }



        mGestureDetector.onTouchEvent(event);



        return true;

    }



    private void obtaionVelocityTracker() {

        if (mVelocityTracker == null)

            mVelocityTracker = VelocityTracker.obtain();

    }



    private void recycleVelocityTracker() {

        if (mVelocityTracker != null) {

            mVelocityTracker.clear();

            mVelocityTracker.recycle();

            mVelocityTracker = null;

        }

    }



}

 

可以使用如上的代码实验一下都什么情况下触发相应的方法

onDown()

每次ACTION_DOWN都触发

 

onShowPress()

ACTION_DOWN并超过一段极短事件后触发

 

onSingleTapUp()

ACTION_DOWNACTION_UP时触发

如果有ACTION_MOVE则不会触发

 

onScroll()

ACTION_MOVE时触发,在ACTION_UP之前

 

onFling()

ACTION_UP后速度超出一定底限后触发

参数中的速度跟自己计算的速度一致

 


onDoubleTap()

连续两次点击时触发


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值