VelocityTracker简单用法

    xiaoxiao2021-12-14  21

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

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

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

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

    [html]  view plain copy 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后的减速运动等。实现一些非常棒的效果。

    转载请注明原文地址: https://ju.6miu.com/read-970968.html

    最新回复(0)