今天突然心血来潮,想在自己的项目里面加一个右滑finish界面的功能。思路很简单就是拦截屏幕滑动事件,然后finish当前页面,不多说了,上代码吧。
第一步:利用VelocityTracker计算滑动速度,及一些附带的代码。
private VelocityTracker mVelocityTracker = null;//速度记录器
private int getScrollVelocity() {
mVelocityTracker.computeCurrentVelocity(1000);
int velocity = (int) mVelocityTracker.getXVelocity();
return Math.abs(velocity);
}
/**
* 回收VelocityTracker对象。
*/
private void recycleVelocityTracker() {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
/**
* 创建VelocityTracker对象,并将触摸content界面的滑动事件加入到VelocityTracker中。
*
* @param event
*
*/
private void createVelocityTracker(MotionEvent event) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
}
第二步:在activity拦截滑动事件,注意如果是重写TouchEvent是先到界面子控件之后才会传递到这个方法中,所以可能导致界面中只有极少的部分能够获取到滑动事件。
private float xDown, xMove;
//手指向右滑动时的最小速度
private static final int XSPEED_MIN = 200;
//手指向右滑动时的最小距离
private static final int XDISTANCE_MIN = 150;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
createVelocityTracker(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = ev.getRawX();
break;
case MotionEvent.ACTION_MOVE:
xMove = ev.getRawX();
//活动的距离
int distanceX = (int) (xMove - xDown);
//获取顺时速度
int xSpeed = getScrollVelocity();
if (distanceX > XDISTANCE_MIN && xSpeed >XSPEED_MIN){
finish();
}
break;
case MotionEvent.ACTION_UP:
recycleVelocityTracker();
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
Android右滑返回上一界面