转自: http://blog.chinaunix.net/uid-23392298-id-3330470.html

http://blog.csdn.net/dylancao/article/details/7534945

用来追踪触摸事件(flinging事件和其他手势事件)的速率。用obtain() 函数来获得类的实例,用addMovement(MotionEvent)函数将motion event加入到VelocityTracker类实例中,当你使用到速率时,使用computeCurrentVelocity(int)初始化速率的 单位,并获得当前的事件的速率,然后使用getXVelocity() 或getYVelocity()获得横向和竖向的速率。

VelocityTracker.computeCurrentVelocity(int units, float maxVelocity)

计算那些已经发生触摸事件点的当前速率。这个函数只有在你需要得到速率消息的情况下才调用,因为使用它需要消耗很大的性能。通过getXVelocity()和getYVelocity()获得横向和竖向的速率。

参数:
units: 你使用的速率单位.1的意思是,以一毫秒运动了多少个像素的速率, 1000表示 一秒时间内运动了多少个像素。

maxVelocity: 这个方法能计算出事件的最大速率。他的值和上面的units的值具有一样的单位,这个值必须是正数。

private VelocityTracker mVelocityTracker;//生命变量//在onTouchEvent(MotionEvent ev)中if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();//获得VelocityTracker类实例}mVelocityTracker.addMovement(ev);//将事件加入到VelocityTracker类实例中//判断当ev事件是MotionEvent.ACTION_UP时:计算速率final VelocityTracker velocityTracker = mVelocityTracker;// 1000 provides pixels per secondvelocityTracker.computeCurrentVelocity(1, (float)0.01); //设置maxVelocity值为0.1时,速率大于0.01时,显示的速率都是0.01,速率小于0.01时,显示正常Log.i("test","velocityTraker"+velocityTracker.getXVelocity());velocityTracker.computeCurrentVelocity(1000); //设置units的值为1000,意思为一秒时间内运动了多少个像素Log.i("test","velocityTraker"+velocityTracker.getXVelocity()); 

详细介绍:

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

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

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

    package com.bxwu.demo.component.activity;      import android.app.Activity;      import android.graphics.Color;      import android.os.Bundle;      import android.view.MotionEvent;      import android.view.VelocityTracker;      import android.view.ViewConfiguration;      import android.view.ViewGroup.LayoutParams;      import android.widget.TextView;            public class VelocityTrackerTest extends Activity {          private TextView mInfo;                private VelocityTracker mVelocityTracker;          private int mMaxVelocity;                private int mPointerId;                @Override          protected void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);                    mInfo = new TextView(this);              mInfo.setLines(4);              mInfo.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));              mInfo.setTextColor(Color.WHITE);                    setContentView(mInfo);                    mMaxVelocity = ViewConfiguration.get(this).getMaximumFlingVelocity();          }                @Override          public boolean onTouchEvent(MotionEvent event) {              final int action = event.getAction();              acquireVelocityTracker(event);              final VelocityTracker verTracker = mVelocityTracker;              switch (action) {                  case MotionEvent.ACTION_DOWN:                      //求第一个触点的id, 此时可能有多个触点,但至少一个                      mPointerId = event.getPointerId(0);                      break;                        case MotionEvent.ACTION_MOVE:                      //求伪瞬时速度                      verTracker.computeCurrentVelocity(1000, mMaxVelocity);                      final float velocityX = verTracker.getXVelocity(mPointerId);                      final float velocityY = verTracker.getYVelocity(mPointerId);                      recodeInfo(velocityX, velocityY);                      break;                        case MotionEvent.ACTION_UP:                      releaseVelocityTracker();                      break;                        case MotionEvent.ACTION_CANCEL:                      releaseVelocityTracker();                      break;                        default:                      break;              }              return super.onTouchEvent(event);          }                /**           *           * @param event 向VelocityTracker添加MotionEvent           *           * @see android.view.VelocityTracker#obtain()           * @see android.view.VelocityTracker#addMovement(MotionEvent)           */          private void acquireVelocityTracker(final MotionEvent event) {              if(null == mVelocityTracker) {                  mVelocityTracker = VelocityTracker.obtain();              }              mVelocityTracker.addMovement(event);          }                /**           * 释放VelocityTracker           *           * @see android.view.VelocityTracker#clear()           * @see android.view.VelocityTracker#recycle()           */          private void releaseVelocityTracker() {              if(null != mVelocityTracker) {                  mVelocityTracker.clear();                  mVelocityTracker.recycle();                  mVelocityTracker = null;              }          }                private static final String sFormatStr = "velocityX=%f\nvelocityY=%f";                /**           * 记录当前速度           *           * @param velocityX x轴速度           * @param velocityY y轴速度           */          private void recodeInfo(final float velocityX, final float velocityY) {              final String info = String.format(sFormatStr, velocityX, velocityY);              mInfo.setText(info);          }      }  

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

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

更多相关文章

  1. onTouch事件传递机制
  2. Android(安卓)pull解析
  3. 关于Android的几种事件处理
  4. Android(安卓)浅析 EventBus (一) 使用
  5. 使用onNewIntent实现startActivityForResult的返回传值
  6. Android系统WIFI设置源码解析
  7. Android触摸事件小小画板(7)
  8. Android(安卓)okhttp3 进行socket connect&poll的底层实现跟踪
  9. Android(安卓)输入系统解析 (2)

随机推荐

  1. android:自定义监听(简单)
  2. Android(安卓)学习之Camera拍照流程
  3. vnc 项目的几点总结
  4. [置顶] android 按钮两次点击事件区分
  5. Android(安卓)Span 的使用
  6. Android(安卓)listview onItemClick事件
  7. Android(安卓)CPU scaling
  8. Android(安卓)动画-Interpolator和TypeEv
  9. AspectJ in Android(安卓)(一),AspectJ 基础
  10. 在Android中使用响应式编程