VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch even。VelocityTracker通过跟踪一连串事件实时计算出当前的速度,这样的用法在android系统空间中随处可见,比如Gestures中的Fling, Scrolling等。

    /** * Helper for tracking the velocity of touch events, for implementing * flinging and other such gestures.  Use {@link #obtain} to retrieve a * new instance of the class when you are going to begin tracking, put * the motion events you receive into it with {@link #addMovement(MotionEvent)}, * and when you want to determine the velocity call * {@link #computeCurrentVelocity(int)} and then {@link #getXVelocity()} * and {@link #getXVelocity()}. */  

简单翻译下:帮助你追踪一个touch事件(flinging事件和其他手势事件)的速率。当你要跟踪一个touch事件的时候,使用obtain()方法得到这个类的实例,然后 用addMovement(MotionEvent)函数将你接受到的motion event加入到VelocityTracker类实例中。当你使用到速率时,使用computeCurrentVelocity(int)初始化速率的单位,并获得当前的事件的速率,然后使用getXVelocity() 或getXVelocity()获得横向和竖向的速率。

Velocity Tracker主要包括的函数如下:
Public Methods
void addMovement(MotionEvent event)

Add a user's movement to the tracker.
void clear()

Reset the velocity tracker back to its initial state.
void computeCurrentVelocity(int units, float maxVelocity)

Compute the current velocity based on the points that have been collected.
int unitis表示速率的基本时间单位。unitis值为1的表示是,一毫秒时间单位内运动了多少个像素, unitis值为1000表示一秒(1000毫秒)时间单位内运动了多少个像素
floatVelocity表示速率的最大值
void computeCurrentVelocity(int units)

Equivalent to invoking computeCurrentVelocity(int, float) with a maximum velocity of Float.MAX_VALUE.
abstract T getNextPoolable()
float getXVelocity()

Retrieve the last computed X velocity.
float getXVelocity(int id)

Retrieve the last computed X velocity.
float getYVelocity(int id)

Retrieve the last computed Y velocity.
float getYVelocity()

Retrieve the last computed Y velocity.
abstract boolean isPooled()
static VelocityTracker obtain()

Retrieve a new VelocityTracker object to watch the velocity of a motion.
void recycle()

Return a VelocityTracker object back to be re-used by others.
abstract void setNextPoolable(T element)
abstract void setPooled(boolean isPooled)

从上面的介绍中,我们可以很使用VelocityTracker类去追踪一个移动事件的速率。VelocityTracker的详细使用不走如下:

1.首先获得VelocityTracker的实例

        if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}

2.把事件event,将事件加入到VelocityTracker类实例中

        mVelocityTracker.addMovement(event);

3. 判断当事件MotionEvent.ACTION_MOVE的时候,调用下面的方法  ,并获取到x,y方向的速度。

                final float velocityX = verTracker.getXVelocity(mPoniterId);final float velocityY = verTracker.getYVelocity(mPoniterId);String info = String.format(sFormatStr, velocityX, velocityY);tv_info.setText(info);

4. 判断当事件MotionEvent.ACTION_UP或者MotionEvent.ACTION_CANCEL的时候释放Velocity Tracker

        if (null != mVelocityTracker) {mVelocityTracker.clear();mVelocityTracker.recycle();mVelocityTracker = null;}

到此Velocity Tracker的基本使用就介绍完毕了,最后附上Demo的源码,进攻参考。

package cn.chinaiptn.velocitytracker;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.ViewConfiguration;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private VelocityTracker mVelocityTracker;private int mMaxVelocity;private int mPoniterId;private TextView tv_info;private static final String sFormatStr = "velocityX=%f\nvelocityY=%f";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_info = (TextView) findViewById(R.id.tv_info);mMaxVelocity = ViewConfiguration.get(MainActivity.this).getMaximumFlingVelocity();}@Overridepublic boolean onTouchEvent(MotionEvent event) {final int action = event.getAction();initVelocityTracker(event);final VelocityTracker verTracker = mVelocityTracker;switch (action) {case MotionEvent.ACTION_DOWN://求第一个触点的id, 此时可能有多个触点,但至少一个mPoniterId = event.getPointerId(0);break;case MotionEvent.ACTION_MOVE://求伪瞬时速度verTracker.computeCurrentVelocity(1000, mMaxVelocity);final float velocityX = verTracker.getXVelocity(mPoniterId);final float velocityY = verTracker.getYVelocity(mPoniterId);String info = String.format(sFormatStr, velocityX, velocityY);tv_info.setText(info);break;case MotionEvent.ACTION_UP:releaseVelocityTracker();break;case MotionEvent.ACTION_CANCEL:releaseVelocityTracker();break;default:break;}return super.onTouchEvent(event);}/*** 向mVelocityTracker添加MotionEvent** @param event*/private void initVelocityTracker(final MotionEvent event) {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}mVelocityTracker.addMovement(event);}/*** 释放VelocityTracker*/private void releaseVelocityTracker() {if (null != mVelocityTracker) {mVelocityTracker.clear();mVelocityTracker.recycle();mVelocityTracker = null;}}}

本文主要参考了 http://blog.csdn.net/lonelyroamer/article/details/7560598

下篇博文将从源码的角度去熟悉Velocity Tracker的工作原理。

VelocityTracker的简单使用相关推荐

  1. 滑轮控件研究四、VelocityTracker的简单研究

    帮助你追踪一个touch事件(flinging事件和其他手势事件)的速率.当你要跟踪一个touch事件的时候,使用obtain()方法得到这个类的实例,然后 用addMovement(MotionEv ...

  2. 使用 PulseSensor 脉搏传感器测量心率之一:平台搭建

    转自:玩的就是心跳 -- 使用 PulseSensor 脉搏传感器测量心率 作者:邵国际 网址:https://zhuanlan.zhihu.com/p/27665378 写文章 https://pi ...

  3. VelocityTracker简单介绍

    翻译自:http://developer.android.com/reference/android/view/VelocityTracker.html 參照自: http://blog.jrj.co ...

  4. 代码解说Android Scroller、VelocityTracker

    在编写自己定义滑动控件时经常会用到Android触摸机制和Scroller及VelocityTracker.Android Touch系统简单介绍(二):实例具体解释onInterceptTouchE ...

  5. android 自定义 滑动删除,Android_Android ListView实现仿iPhone实现左滑删除按钮的简单实例,需要自定义ListView。这里就交Fl - phpStudy...

    Android ListView实现仿iPhone实现左滑删除按钮的简单实例 需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Ov ...

  6. Activity简单几步支持向右滑动返回

    向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返回按钮,轻轻向右滑动屏幕即可返回上一页,这个功能如 ...

  7. 速度追踪--VelocityTracker

    概述 我们都知道安卓手机的事件分为两类,一类是按键事件,另一类就是屏幕滑动事件,而我们大部分的事件都是通过屏幕滑动来产生的.在滑动的过程中你有没有想过要求一下手指在屏幕上滑动的速度呢!我们可以在滑动事 ...

  8. 防人人网客户端侧滑效果,简单实现Android滑动菜单特效

    人人网客户端,有一个侧滑效果不错,就是菜单(menu)和内容(content)可以实现侧滑. 首先,我们先来看一下最终的效果图,有图有真相,这样讲解起来,会更加的清楚. 程序运行时,我们刚开始看到的是 ...

  9. scrollTo与scrollBy用法以及TouchSlop与VelocityTracker解析

    下一篇: scroller类的用法完全解析以及带源码分析 最近在工作中使用到了scrollTo与scrollBy,因此在这准备对它们的用法以及TouchSlop与VelocityTracker做一下整 ...

最新文章

  1. 北大30岁女博导获2019 IEEE青年成就奖,全球仅三人,深耕微纳电子、神经形态计算...
  2. Example of BeanFactoryAware in Spring--转
  3. 论文浅尝 | 改善多语言KGQA的 Zero-shot 跨语言转换
  4. live2dviewer android,live2dviewerex安卓版
  5. 大工13秋《计算机文化基础》在线测试1,大工13秋《计算机文化基础》辅导资料六...
  6. DPDK 中文编程指南
  7. 证明神经网络的通用逼近定理_在您理解通用逼近定理之前,您不会理解神经网络。...
  8. 欢迎关注中文开源字体集 Open Source Fonts Collection for Chinese
  9. McAfee软件下载与安装
  10. 英语3500词(20/20)dream主题(2022.4.30)
  11. 推荐一款全能测试开发神器!1分钟快速上手!
  12. 基于Java的飞机大战游戏的设计与实现(含源文件)
  13. 游戏王-黑暗大魔法师发动教程
  14. 2022-08-22 第六小组 瞒春 学习笔记
  15. 凸优化笔记6(共轭梯度法)
  16. 比较 Java 枚举成员:== 或 equals()?
  17. 一期项目实战:问卷调查—人事管理系统
  18. 极客大挑战php,2019极客大挑战PHP反序列化
  19. 技术男的春天:小姐姐求助暖男分析
  20. 带滑动侧边栏的联系人界面

热门文章

  1. 简道云-第2章-应用
  2. 如何统计vim中查找字符串的数量
  3. Go程序性能分析方法(一文全解)
  4. 2.4 电子邮件(Email)
  5. 无线网卡、无线上网卡、网卡、有线网卡的个人总结
  6. 最全面的Socket使用解析
  7. raid6 p和q计算方法
  8. Appscan工具之环境搭建
  9. 在传统公司干IT是一种什么体验(四)
  10. 使用Python脚本自己实现数据下载,还有花哨的下载进度显示