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;    }}

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

邀请你加入,我们一起免费成长,改变只需一秒钟

更多相关文章

  1. 【Android归纳决】回调机制在Android中的应用与实战
  2. [置顶] android调用第三方库——第三篇——编写库android程序整
  3. Android6.0 WMS(六) WMS动画管理
  4. Android查看调用函数名与行号等信息的日志类
  5. 详解Android(安卓)Surface系统
  6. Android(安卓)GridView+listener
  7. android Glide3.7 圆角图片
  8. android Junit demo
  9. 手写功能,撤回上一步,清空,保存 功能

随机推荐

  1. Android(安卓)Maps
  2. Android(安卓)开发系列 2 Activity
  3. Intent调用
  4. Android(安卓)时间对象操作工具类
  5. android之GestureDetector
  6. android笔记一 控件属性
  7. android点滴4
  8. android OnGestureListener滑动事件详解
  9. Android(安卓)之 发送短信
  10. 新版本Android(安卓)Souce 编译问题