VelocityTracker:计算滑动速率

QuibblerQuibbler 2020-03-29 约 6 分钟 2736 次阅读

VelocityTracker:计算滑动速率

速度追踪,计算在手机屏幕上滑动速度,无论是水平还是垂直的速度。Android已经为我们提供了一个类VelocityTracker,借助VelocityTracker可以很方便的计算触摸屏幕的滑动速度。

获取VelocityTracker,很简单,通过VelocityTracker类的静态方法obtain()获取。

VelocityTracker mVelocityTracker  = VelocityTracker.obtain();

        从源码可以看到是维护了一个VelocityTracker对象池,从这个同步的SynchronizedPool中获取VelocityTracker对象实例(如果没有则创建对象)。

private static final SynchronizedPool<VelocityTracker> sPool = new SynchronizedPool<VelocityTracker>(2);
    ...
    static public VelocityTracker obtain() {
        VelocityTracker instance = sPool.acquire();
        return (instance != null) ? instance : new VelocityTracker(null);
    }

设置VelocityTracker,参数是时间单位ms,比如1000ms内的移动速率。

mVelocityTracker.computeCurrentVelocity(1000);

还有一个重载的方法,第二个浮点型参数是设定能测量的最大速率。

mVelocityTracker.computeCurrentVelocity(1000, 2000.0f);

        看源码可以发现这两个方法都调用了同一个JNI底层的接口,只是第一个方法将速度设定默认无限Float.MAX_VALUE。

public void computeCurrentVelocity(int units) {
        nativeComputeCurrentVelocity(mPtr, units, Float.MAX_VALUE);
    }
    
    //到了native层
    private static native void nativeComputeCurrentVelocity(long ptr, int units, float maxVelocity);

在触摸事件监听中将event传给VelocityTracker。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        if (mVelocityTracker == null) {
            mVelocityTracker = VelocityTracker.obtain();
        }
        mVelocityTracker.addMovement(event);
        
        switch (event.getAction()) {
            //滑动event加入计算
            case MotionEvent.ACTION_MOVE:
                mVelocityTracker.computeCurrentVelocity(1000);
                int X = (int) mVelocityTracker.getXVelocity();
                int Y = (int) mVelocityTracker.getYVelocity();
                break;
            //抬起时释放
            case MotionEvent.ACTION_UP:
                if (null != mVelocityTracker) {
                    mVelocityTracker.clear();
                    mVelocityTracker.recycle();
                    mVelocityTracker = null;
                }
                break;
            default:
                break;
        }
        return super.onTouchEvent(event);
    }

就可以计算获得触摸过程中的滑动速率。注意get速率的方法有两个一个无参,一个有参,出入的是触摸指针的id,源码说明是Which pointer's velocity to return。因为现在手机是多点触控的,可以同时又很多手指触摸屏幕移动,默认传入-1。

每次都能遇到Android玄学坑,一模一样的代码为什么测不出来速度呢?调试了很长时间,终于找到原因,原来设置时间computeCurrentVelocity()方法必须放在addMovement(event)方法之后调用,否则获得的一直是0.0f!

相关推荐

WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175