Android VelocityTracker

转自: 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 second
velocityTracker.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. static public VelocityTracker obtain();  //获得VelocityTracker类实例
  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);  
    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后的减速运动等。实现一些非常棒的效果。

猜你喜欢

转载自751401909.iteye.com/blog/1750767
今日推荐