VelocityTracker简单用法

来源:互联网 发布:centos搭建php网站 编辑:程序博客网 时间:2024/05/21 11:37

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

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

//获取一个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:

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