使用VelocityTracker获取在屏幕滑动的速度

前言

  在写自定义控件的时候,我们有时候需要根据在屏幕滑动的速度来判断接下来的操作是什么。而Android给我们提供了VelocityTracker这个类来快速得到滑动速度,接下来我就说明该如何使用这个类。

实现

  我们先看一下效果图:


  从效果图中可以看到,在滑动的时候我们可以获取实时的速度,有了这样的速度我们就可以进行自己的操作了。

  我自己自定义了一个View->VelocityView,在这个View里面我实现了滑动的操作,具体就是覆盖onTouchEvent方法,然后对ACTION_MOVE动作进行响应即可,看一下源码。

public class VelocityView extends View{
    private VelocityTracker mTracker;
    private OnTrackerListener mListener;
    public VelocityView(Context context){
        super(context);
    }

    public VelocityView(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    public interface OnTrackerListener{
        void getXSpeed(int speed);
        void getYSpeed(int speed);
    }

    public void setTrackerListener(OnTrackerListener listener){
        mListener = listener;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        getTracker(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                if(mTracker==null){
                    mTracker = VelocityTracker.obtain();
                }else{
                    mTracker.clear();
                }
                mTracker.addMovement(event);
                break;
            case MotionEvent.ACTION_MOVE:
                mTracker.addMovement(event);
                mTracker.computeCurrentVelocity(1000);
                getSpeed();
                break;
            case MotionEvent.ACTION_UP:
                cancelTracker();
                break;
        }
        return true;
    }

    private void cancelTracker(){
        if(mTracker!=null){
            mTracker.recycle();
            mTracker = null;
        }
    }

    private void getSpeed(){
        mTracker.computeCurrentVelocity(1000);
        int xSpeed = (int)Math.abs(mTracker.getXVelocity());
        int ySpeed = (int)Math.abs(mTracker.getYVelocity());
        if(mListener!=null){
            mListener.getXSpeed(xSpeed);
            mListener.getYSpeed(ySpeed);
        }
    }

    private void getTracker(MotionEvent event){
        if(mTracker==null){
            mTracker = VelocityTracker.obtain();
            mTracker.addMovement(event);
        }
    }
}

  代码也比较简单,主要是用到了下面的几个方法:

  • obtain() 这个方法是静态方法,是用来获取VelocityTracker的一个实例。

  • addMovement(MotionEvent event)将event对象添加到VelocityTracker的实例当中。

  • recycle 回收VelocityTracker的一个实例。

  • computeCurrentVelocity(int units) 该方法用来计算在units毫秒内,运动了多少个像素。如果units值为1000,那么就是在1秒内运动的像素数,也就是速度。

  • computeCurrentVelocity(int units,float maxVelocity) maxVelocity表示速率的最大值,如果设置成200,那么当速度大于200时,返回值为200,速度低于200时则正常返回。

  • getXVelocity 返回在X方向上的速度

  • getYVelocity 返回在Y方向上的速度

小结

  这个类的作用还是挺大的,比如说在做侧滑菜单的时候,我们得到滑动的速度,如果速度大于一定的值,那么我们就显示菜单,否则就不显示,这比获取坐标然后计算差值最后计算速度要方便的多。

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值