转载http://blog.csdn.net/wobilini/article/details/9071579
转载http://blog.csdn.net/hudashi/article/details/7352157
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毫秒)时间单位内运动了多少个像素 floatVelocity表示速率的最大值 |
||||||||||
void | computeCurrentVelocity(int units)
Equivalent to invoking |
||||||||||
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 ()函数来获得当前的速度
布局文件 activity_main:
在这里,我们只定义了一个TextView用来显示等下我们的手指移动的速度,这里我们把它初始化为:hello world
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello world" />
</RelativeLayout>
再下来是MainActivity:
public class MainActivity extends Activity{
private TextView tv;
private VelocityTracker vt=null;
protect void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=()findViewById(R.id.tv);
}
public boolean onTouchEvent(MotionEvent event){
int action=event.getAvtion();
switch(action){
case:MotionEvent.ACTION_DOWN:
if(vt==null){
//初始化velocityTracker的对象 vt 用来监测motionevent的动作
vt=VelocityTracker.obtain();
}else{
vt.clear();
}
vt.addMovement(event);
break;
case:MotionEvent.ACTION_MOVE:
vt.addMovement(event);
//代表的是监测每1000毫秒手指移动的距离(像素)即m/px,这是用来控制vt的单位,若括号内为1,则代表1毫秒手指移动过的像素数即ms/px
vt.computeCurrentVelocity(1000);
//这里x为正则代表手指向右滑动,为负则代表手指向左滑动,y的比较特殊,为正则代表手指向下滑动,为负则代表手指向上滑动
tv.setText("the x velocity is"+vt.getXVelocity);
tv.append("the y velocity is"+vt.getYVelocity);
break;
case:MotionEvent.ACTION_UP:
case:MotionEvent.CANCEL:
vt.recycle();
break;
}
return true;
}
}