VelocityTracker:计算滑动速率

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

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!

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w