您的位置:首页 > 其它

VelocityTracker简单用法

2015-11-23 16:09 323 查看


VelocityTracker简单用法

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