您的位置:首页 > 其它

VelocityTracker简单用法

2016-12-03 19:56 253 查看
VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出

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

[html] view
plaincopy

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

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后的减速运动等。实现一些非常棒的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: