VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出

当前的速度,这样的用法在android系统空间中随处可见,比如Gestures中的Fling, Scrolling等,下面简单介绍一下用法。

  1. //获取一个VelocityTracker对象, 用完后记得回收
  2. //回收后代表你不需要使用了,系统将此对象在此分配到其他请求者
  3. static public VelocityTracker obtain();
  4. public void recycle();
  5. //计算当前速度, 其中units是单位表示, 1代表px/毫秒, 1000代表px/秒, ..
  6. //maxVelocity此次计算速度你想要的最大值
  7. public void computeCurrentVelocity(int units, float maxVelocity);
  8. //经过一次computeCurrentVelocity后你就可以用一下几个方法获取此次计算的值
  9. //id是touch event触摸点的ID, 来为多点触控标识,有这个标识在计算时可以忽略
  10. //其他触点干扰,当然干扰肯定是有的
  11. public float getXVelocity();
  12. public float getYVelocity();
  13. public float getXVelocity(int id);
  14. public float getYVelocity(int id);

下面是我写的一个简单Demo:

  1. package com.bxwu.demo.component.activity;
  2. import android.app.Activity;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.view.MotionEvent;
  6. import android.view.VelocityTracker;
  7. import android.view.ViewConfiguration;
  8. import android.view.ViewGroup.LayoutParams;
  9. import android.widget.TextView;
  10. public class VelocityTrackerTest extends Activity {
  11. private TextView mInfo;
  12. private VelocityTracker mVelocityTracker;
  13. private int mMaxVelocity;
  14. private int mPointerId;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. mInfo = new TextView(this);
  19. mInfo.setLines(4);
  20. mInfo.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
  21. mInfo.setTextColor(Color.WHITE);
  22. setContentView(mInfo);
  23. mMaxVelocity = ViewConfiguration.get(this).getMaximumFlingVelocity();
  24. }
  25. @Override
  26. public boolean onTouchEvent(MotionEvent event) {
  27. final int action = event.getAction();
  28. acquireVelocityTracker(event);
  29. final VelocityTracker verTracker = mVelocityTracker;
  30. switch (action) {
  31. case MotionEvent.ACTION_DOWN:
  32. //求第一个触点的id, 此时可能有多个触点,但至少一个
  33. mPointerId = event.getPointerId(0);
  34. break;
  35. case MotionEvent.ACTION_MOVE:
  36. //求伪瞬时速度
  37. verTracker.computeCurrentVelocity(1000, mMaxVelocity);
  38. final float velocityX = verTracker.getXVelocity(mPointerId);
  39. final float velocityY = verTracker.getYVelocity(mPointerId);
  40. recodeInfo(velocityX, velocityY);
  41. break;
  42. case MotionEvent.ACTION_UP:
  43. releaseVelocityTracker();
  44. break;
  45. case MotionEvent.ACTION_CANCEL:
  46. releaseVelocityTracker();
  47. break;
  48. default:
  49. break;
  50. }
  51. return super.onTouchEvent(event);
  52. }
  53. /**
  54. *
  55. * @param event 向VelocityTracker添加MotionEvent
  56. *
  57. * @see android.view.VelocityTracker#obtain()
  58. * @see android.view.VelocityTracker#addMovement(MotionEvent)
  59. */
  60. private void acquireVelocityTracker(final MotionEvent event) {
  61. if(null == mVelocityTracker) {
  62. mVelocityTracker = VelocityTracker.obtain();
  63. }
  64. mVelocityTracker.addMovement(event);
  65. }
  66. /**
  67. * 释放VelocityTracker
  68. *
  69. * @see android.view.VelocityTracker#clear()
  70. * @see android.view.VelocityTracker#recycle()
  71. */
  72. private void releaseVelocityTracker() {
  73. if(null != mVelocityTracker) {
  74. mVelocityTracker.clear();
  75. mVelocityTracker.recycle();
  76. mVelocityTracker = null;
  77. }
  78. }
  79. private static final String sFormatStr = "velocityX=%f\nvelocityY=%f";
  80. /**
  81. * 记录当前速度
  82. *
  83. * @param velocityX x轴速度
  84. * @param velocityY y轴速度
  85. */
  86. private void recodeInfo(final float velocityX, final float velocityY) {
  87. final String info = String.format(sFormatStr, velocityX, velocityY);
  88. mInfo.setText(info);
  89. }
  90. }

代码很简单,我们可以求出move过程中的伪瞬时速度, 这样在做很多控件的时候都是可以用到的,比如系统Launcher的分页,

ScrollView滑动等, 可根据此时的速度来计算ACTION_UP后的减速运动等。实现一些非常棒的效果。

VelocityTracker的更多相关文章

  1. android VelocityTracker 速度追踪器的使用及创建

    VelocityTracker 速度追踪 第一,创建方式: VelocityTracker  mVelocityTracker  = new VelocityTracker .obtain() 第二, ...

  2. 使用VelocityTracker来完成MotionEvent移动速率计算

    先看效果图 关键代码(此处记录单点): switch (event.getAction()){ case MotionEvent.ACTION_DOWN: if (veloctiy==null) { ...

  3. TouchSlop与VelocityTracker认识

    TouchSlop是处理触摸事件中的一个常量,被系统认为滑动和点击事件的临界点.理 解这个touchSlop是一个滑动距离值的常量,也就是说当我们手触摸在屏幕上滑动时,如果滑动距离没有超过touchS ...

  4. VelocityTracker简介

    android.view.VelocityTracker主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率.用addMovement(MotionEvent)函数将Mot ...

  5. 手势识别官方教程(3)识别移动手势(识别速度用VelocityTracker)

    moving手势在onTouchEvent()或onTouch()中就可识别,编程时主要是识别积云的速度用VelocityTracker等, Tracking Movement This lesson ...

  6. 代码讲解Android Scroller、VelocityTracker

    在编写自定义滑动控件时常常会用到Android触摸机制和Scroller及VelocityTracker.Android Touch系统简介(二):实例详解onInterceptTouchEvent与 ...

  7. VelocityTracker简单介绍

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

  8. Android UI 学习 自定义的布局 平滑移动 VelocityTracker()

    /**  * Helper for tracking the velocity of touch events, for implementing  * flinging and other such ...

  9. Android为TV端助力 VelocityTracker 速度追踪器的使用及创建

    VelocityTracker 速度追踪 第一,创建方式: VelocityTracker  mVelocityTracker  = new VelocityTracker .obtain() 第二, ...

随机推荐

  1. [ html canvas createImageData 创建万花筒效果 ] canvas绘图属性 createImageData 属性讲解 及创建万花筒效果

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  2. Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be

    Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be   今天在其他电脑配置 SQl server 2008 R2,安装完成后,发现打开配置管理工具服务 : ...

  3. IOS SizeClasses 详解

    SizeClasses 详解 iOS 8在应用界面的可视化设计上添加了一个新的特性-Size Classes.对于任何设备来说,界面的宽度和高度都只分为三种描述:紧凑,任意和宽松.这样开发者便可以无视 ...

  4. 编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题

    在新的SDK环境中调试百度地图的应用程序时,app总是意外退出,找了半天发现错误的原因是unrecognized selector xx的错误,另外还有报了一个Unknown class XXX in ...

  5. JavaScript Patterns 4.6 Immediate Object Initialization

    ( { // here you can define setting values // a.k.a. configuration constants maxwidth : 600, maxheigh ...

  6. jQuery无刷新上传之uploadify简单试用

    先简单的侃两句:貌似已经有两个月的时间没有写过文章了,不过仍会像以前那样每天至少有一至两个小时是泡在园子里看各位大神的文章.前些天在研究“ajax无刷新上传”方面的一些插件,用SWFUpload实现了 ...

  7. 如何解决ajax跨域问题(转)

    由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题.本篇将讲述一个小白从遇到跨域不 ...

  8. MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在M ...

  9. Windows环境下maven 安装与环境变量配置

    Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...

  10. hdu 1506

    题目中叫求一个最大的区域,则第i个矩形对应的面积是ave[i] = (r[i] – l[i] + 1) * a[i];l[i]表示以它这个高度所能到达的最左边的位置(最左一个高度不小于它的高度的位置) ...