前言
在写自定义控件的时候,我们有时候需要根据在屏幕滑动的速度来判断接下来的操作是什么。而Android给我们提供了VelocityTracker这个类来快速得到滑动速度,接下来我就说明该如何使用这个类。
实现
我们先看一下效果图:
从效果图中可以看到,在滑动的时候我们可以获取实时的速度,有了这样的速度我们就可以进行自己的操作了。
我自己自定义了一个View->VelocityView,在这个View里面我实现了滑动的操作,具体就是覆盖onTouchEvent方法,然后对ACTION_MOVE动作进行响应即可,看一下源码。
public class VelocityView extends View{
private VelocityTracker mTracker;
private OnTrackerListener mListener;
public VelocityView(Context context){
super(context);
}
public VelocityView(Context context, AttributeSet attrs){
super(context, attrs);
}
public interface OnTrackerListener{
void getXSpeed(int speed);
void getYSpeed(int speed);
}
public void setTrackerListener(OnTrackerListener listener){
mListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event){
getTracker(event);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
if(mTracker==null){
mTracker = VelocityTracker.obtain();
}else{
mTracker.clear();
}
mTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
mTracker.addMovement(event);
mTracker.computeCurrentVelocity(1000);
getSpeed();
break;
case MotionEvent.ACTION_UP:
cancelTracker();
break;
}
return true;
}
private void cancelTracker(){
if(mTracker!=null){
mTracker.recycle();
mTracker = null;
}
}
private void getSpeed(){
mTracker.computeCurrentVelocity(1000);
int xSpeed = (int)Math.abs(mTracker.getXVelocity());
int ySpeed = (int)Math.abs(mTracker.getYVelocity());
if(mListener!=null){
mListener.getXSpeed(xSpeed);
mListener.getYSpeed(ySpeed);
}
}
private void getTracker(MotionEvent event){
if(mTracker==null){
mTracker = VelocityTracker.obtain();
mTracker.addMovement(event);
}
}
}
代码也比较简单,主要是用到了下面的几个方法:
obtain() 这个方法是静态方法,是用来获取VelocityTracker的一个实例。
addMovement(MotionEvent event)将event对象添加到VelocityTracker的实例当中。
recycle 回收VelocityTracker的一个实例。
computeCurrentVelocity(int units) 该方法用来计算在units毫秒内,运动了多少个像素。如果units值为1000,那么就是在1秒内运动的像素数,也就是速度。
computeCurrentVelocity(int units,float maxVelocity) maxVelocity表示速率的最大值,如果设置成200,那么当速度大于200时,返回值为200,速度低于200时则正常返回。
getXVelocity 返回在X方向上的速度
getYVelocity 返回在Y方向上的速度
小结
这个类的作用还是挺大的,比如说在做侧滑菜单的时候,我们得到滑动的速度,如果速度大于一定的值,那么我们就显示菜单,否则就不显示,这比获取坐标然后计算差值最后计算速度要方便的多。
【源码下载】