Android VelocityTracker提供手指速度计算,可用于笔迹优化哦

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_he_n/article/details/82890061

VelocityTracker

这是一个Android中提供的追踪手指速度的类,我也是在读viewpager源码的发现的,这样不用苦苦的去计算手指的速度,源码中的注释,真是太强大了,只要只字不差的按照他的描述,一般使用是没有问题的。
这个如何使用确实有讲究的,为什么要计算手指的速度呢,可以用于优化画笔的笔触等应用。其实只需要学会使用这个类即可,这个类本身并没有给出计算速度的算法。接下来,我们就看看如何使用这个类:

阅读下面源码,有如下的主函数

1. VelocityTracker.obtain(); //获取VelocityTracker对象
2. addMovement(MotionEvent event);//将motionEVent添加进去进行监听。这个是必须调用的
3. computeCurrentVelocity(int units) //这个也是的,因为要告诉系统我要计算的单位,这个unites表示的意思为每秒处理多少像素,
4. //一般的取值为1000。一般的取值为1000。
5. computeCurrentVelocity(int units,float maxVelocity) //上面那个函数其实调用的这个函数,只是maxVelocity设置为Float.MAX_VALUE,你也可以在这里限定最大的速度,只要手指超过这个maxVelocity值,就设定手指的速度为maxVelocity。
6. getXVelocity(int id)/getYVelocity(int id)//分别为获取手指在x,y轴方向的速度,id代表的手指的id。
7. recycle()//这个函数看到名字我想也知道这个是干嘛的,在取消的时候把这个事件回收。

我只列出了经常使用的函数,还有不经常使用的我没有列出来,比如Estimator 这个根据现有速度来预测接下来的运动,这在做惯性运动应该用得着。

按照这个类前面的注释基本上就会使用了,没有过多的技巧。

  1. 先使用VelocityTracker.obtain()获取VelocityTracker对象。
  2. 将MotionEvent事件通过mVelocityTracker.addMovement(…)加入监听。
  3. 这一步我以为可加,可不加,但是不加返回的速度全部为零,所以是必须要写的。computeCurrentVelocity(1000),源码注释中推荐采用1000。
  4. 通过getXVelocity(int id)/getYVelocity(int id)可以获取速度。
  5. 在取消或者拿起的调用,回收对象。

说了那么多废话,直接上代码吧。我自定义了一个view

public class PointerSpeedView extends View {
    VelocityTracker velocityTracker = null;

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

    public PointerSpeedView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public PointerSpeedView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int action = event.getAction() & MotionEvent.ACTION_MASK;
        velocityTracker = VelocityTracker.obtain();
        velocityTracker.addMovement(event);
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                velocityTracker.computeCurrentVelocity(1000);
                Log.i("speed", "move speed:" + velocityTracker.getXVelocity());
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL: // Return a VelocityTracker object back to be re-used by others.               
                velocityTracker.recycle();
                break;
        }
        return true;
    }
}

接下来我用这个做笔迹优化,哈哈哈哈。

猜你喜欢

转载自blog.csdn.net/c_he_n/article/details/82890061