版权声明:本文为博主原创文章,未经博主允许不得转载。 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 这个根据现有速度来预测接下来的运动,这在做惯性运动应该用得着。
按照这个类前面的注释基本上就会使用了,没有过多的技巧。
- 先使用VelocityTracker.obtain()获取VelocityTracker对象。
- 将MotionEvent事件通过mVelocityTracker.addMovement(…)加入监听。
- 这一步我以为可加,可不加,但是不加返回的速度全部为零,所以是必须要写的。computeCurrentVelocity(1000),源码注释中推荐采用1000。
- 通过getXVelocity(int id)/getYVelocity(int id)可以获取速度。
- 在取消或者拿起的调用,回收对象。
说了那么多废话,直接上代码吧。我自定义了一个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;
}
}
接下来我用这个做笔迹优化,哈哈哈哈。