Android(安卓)基础知识之 VelocityTracker使用(提供手指速度计算,可用于笔迹优化哦)
16lz
2021-01-26
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; }}
接下来我用这个做笔迹优化,哈哈哈哈。
邀请你加入,我们一起免费成长,改变只需一秒钟
更多相关文章
- 【Android归纳决】回调机制在Android中的应用与实战
- [置顶] android调用第三方库——第三篇——编写库android程序整
- Android6.0 WMS(六) WMS动画管理
- Android查看调用函数名与行号等信息的日志类
- 详解Android(安卓)Surface系统
- Android(安卓)GridView+listener
- android Glide3.7 圆角图片
- android Junit demo
- 手写功能,撤回上一步,清空,保存 功能