android.view.VelocityTracker
主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率。用
addMovement(MotionEvent)
函数将Motion event加入到VelocityTracker类实例中.你可以使用
getXVelocity()
或
getXVelocity()
获得横向和竖向的速率到速率时,但是使用它们之前请先调用
computeCurrentVelocity
(int)
来初始化速率的单位 。
主要函数
Public Methods |
void |
addMovement( MotionEvent event)
Add a user's movement to the tracker.
|
void |
clear()
Reset the velocity tracker back to its initial state.
|
void |
computeCurrentVelocity(int units, float maxVelocity)
Compute the current velocity based on the points that have been collected.
int
unitis表示速率的基本时间单位。unitis值为
1的表示是,一毫秒时间单位内运动了多少个像素, unitis值为
1000表示一秒(1000毫秒)时间单位内运动了多少个像素
float
Velocity表示速率的最大值
|
void |
computeCurrentVelocity(int units)
Equivalent to invoking
computeCurrentVelocity(int, float) with a maximum velocity of Float.MAX_VALUE.
|
abstract T |
getNextPoolable() |
float |
getXVelocity()
Retrieve the last computed X velocity.
|
float |
getXVelocity(int id)
Retrieve the last computed X velocity.
|
float |
getYVelocity(int id)
Retrieve the last computed Y velocity.
|
float |
getYVelocity()
Retrieve the last computed Y velocity.
|
abstract boolean |
isPooled() |
static VelocityTracker |
obtain()
Retrieve a new VelocityTracker object to watch the velocity of a motion.
|
void |
recycle()
Return a VelocityTracker object back to be re-used by others.
|
abstract void |
setNextPoolable(T element) |
abstract void |
setPooled(boolean isPooled) |
示例:
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());
大体的使用是这样的:
当你需要跟踪触摸屏事件的速度的时候,使用
obtain()
方法来获得
VelocityTracker
类的一个实例对象
在
onTouchEvent
回调函数中,使用
addMovement(MotionEvent)
函数将当前的移动事件传递给
VelocityTracker
对象
使用
computeCurrentVelocity (int units)
函数来计算当前的速度,使用
getXVelocity ()
、
getYVelocity ()
函数来获得当前的速度
example:自定义listview 对listview监听上下滑动的速率
public class RankListView extends ListView {
/**
* @param context
*/
public RankListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
*/
public RankListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
* @param defStyle
*/
public RankListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
private VelocityTracker mVelocityTracker;
boolean visibleType;
private Callback callback;
public void setCallback(Callback callback) {
this.callback = callback;
}
public void setVisibleType(boolean visibleType) {
this.visibleType = visibleType;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
if (event.getAction() == MotionEvent.ACTION_MOVE) {
//功能实现部分
} else if (event.getAction() == MotionEvent.ACTION_UP) {
final VelocityTracker velocityTracker = mVelocityTracker;
//设置每秒移动的速度是1000像素
velocityTracker.computeCurrentVelocity(1000);
//获取y轴方向的移动量
int velocityY = (int) velocityTracker.getYVelocity();
//具体功能实现
if (velocityY > 600) {
if (!visibleType) {
if (callback != null) {
callback.moveDown();
}
return true;
}
} else if (velocityY < -600) {
if (visibleType) {
if (callback != null) {
callback.moveUp();
}
return true;
}
}
mVelocityTracker.recycle();
mVelocityTracker = null;
}
return super.dispatchTouchEvent(event);
}
//不用的时候回收资源
public void reset() {
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
visibleType = false;
}
//定义回调接口
public static interface Callback {
void moveDown();
void moveUp();
}
}