Activity实现滑动返回的核心方法

/**
* 界面滑动事件响应处理
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
createVelocityTracker(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = ev.getRawX();
yDown = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
xMove = ev.getRawX();
yMove = ev.getRawY();
break;
case MotionEvent.ACTION_UP:
//计算滑动的距离
int distanceX = (int) (xMove - xDown);
int distanceY = (int) (yMove - yDown);

int ySpeed = getScrollVelocity();
// 关闭Activity需满足以下条件:
// 1. x轴滑动的距离大于 XDISTANCE_MIN(设定的x轴最小移动距离)
// 2. y轴滑动的距离在 YDISTANCE_MAX(设定的y轴最大移动距离)
// 3. y轴上滑动速度小于设定的YSPEED_MAX(设定的最大滑动速度),否则认为是上下滑动而不是右滑结束activity
// 4. 子activity中设置isOpenDistanceBack为true即打开状态,才能进行滑动返回
if (distanceX > XDISTANCE_MIN && ySpeed < YSPEED_MAX
&& (distanceY < YDISTANCE_MAX && distanceY > -YDISTANCE_MAX) && isOpenDistanceBack) {
finish();
//方法必须在startActivity()或者finish()之后执行,才有效果
overridePendingTransition(R.anim.in_from_left, R.anim.out_from_right);
}

recycleVelocityTracker();
break;

}
return super.dispatchTouchEvent(ev);
}

/**
* 创建VelocityTracker对象,并将触摸界面的滑动事件加入到VelocityTracker中
*
* @param ev
*/
private void createVelocityTracker(MotionEvent ev) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(ev);
}

/**
* 计算每秒钟y方向滑动的距离
*
* @return
*/
private int getScrollVelocity() {
mVelocityTracker.computeCurrentVelocity(1000);
int velocity = (int) mVelocityTracker.getYVelocity();
return Math.abs(velocity);
}

/**
* 回收VelocityTracker对象
*/
private void recycleVelocityTracker() {
mVelocityTracker.recycle();
mVelocityTracker = null;
}

你可能感兴趣的:(Activity实现滑动返回的核心方法)