[置顶] Android 中VelocityTracker 介绍及简单用法

导读

在自定义控件的开发中,会根据某些条件来进行界面的变换和其他操作。例如:通过手势检测下拉手势来进行列表的下拉。有的也通过检测速度来进行相关的操作。如 当速度大打某一个阈值的时候,进行某些操作,今天就来介绍Android用于速度检测的类–VelocityTracker。

简介

根据谷歌开发者参考文档,VelocityTracker用于跟踪触摸事件的速度。我们可以通过 obtail()方法获得 VelocityTracker实例。在你想要检测的触摸事件中 使用 addMovement()将触摸事件传递给VelocityTracker进行计算。在得到速度之前,我们应该先调用computeCurrentVelocity的重载方法计算此时的速度,然后我们就能通过getVelcity来得到我们想要的速度。

实例

下会自定义一个View用于实验VelocityTracker的用法。

public class DemoView extends View {

    private static final String TAG = "DemoView";
    private VelocityTracker  velocityTracker;

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

    public DemoView(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        velocityTracker = VelocityTracker.obtain();
        velocityTracker.addMovement(event);
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            velocityTracker.computeCurrentVelocity(1000, Float.MAX_VALUE);
            Log.e(TAG,velocityTracker==null?"null":(velocityTracker.getXVelocity()+""));
            break;
        case MotionEvent.ACTION_UP:

            if (velocityTracker!=null) {
                velocityTracker.recycle();
                velocityTracker= null;
            }
            break;
        default:
            break;
        }
        return true;
    }

我们在接收到onTouchEvent中获得 VelocityTracker对象,并将该事件传递给VelocityTracker对象。我们想要计算手指在手机屏幕上面滑动的速度,就在 Action_Move中去计算此时的速度和得到垂直方向或竖直方向的速度。上列中,我们获取的是 水平方向的速度。当手指向右滑动的时候,速度是正数,反之为负数。当手指滑动越快,得到速度的绝对值越大。在Action_Up中我们对 VelocityTracker进行回收。
在最后,我们应该在onTouchEvent中返回true,代表我们消耗了这个事件,这样后续事件才能继续传递进来。

关键点

当我们想要得到速度值之前必须调用computeCurrentVelocity方法以计算速度,不然得到的速度为空。
computeCurrentVelocity有两个重载方法,其中,一个参数的方法调用了两个参数的方法。

 public void computeCurrentVelocity(int units) {
        computeCurrentVelocity(units, Float.MAX_VALUE);
    }

在 两个参数的方法中,传入两个整形值。units和maxVelocity。第一个参数规定了速度检测的时间段,VelocityTracker会在units时间段内对速度进行检测,但是是毫秒。
maxVelocity指的是最大检测速度。一般传Float.MaxValue。

你可能感兴趣的:(android,速度检测)