转载请说明出处:http://blog.csdn.net/github_37547547/article/details/55510084
在ios中,苹果的原生态应用几乎都能够通过向右滑动来返回到前一个页面,这样可以避免用户在单手操作时用大拇指去点击那个遥远的返回键(iphone5的这种返回被吐糟为反人类设计)。然而现在android的手机市场上几乎很难找到小于4寸屏的手机了,几乎所有的应用都是通过点击左上角的返回来退到上一个页面,如果单手拿一个大屏手机,我是觉得会发疯。但是Android基本都会有物理按键返回功能,但是有些写详情页加入侧滑返回用户体验会更加流畅,所以在此写了一个侧滑返回的Activity,继承此Activity就可以实现Activity的侧滑返回。
注意:需要修改你Activity的theme,继承@android:style/Theme.Translucent
/**
* 继承此activity实现向右滑动返回
*/
public abstract class SlideBackActivity extends FragmentActivity {
//手指上下滑动时的最小速度
private static final int YSPEED_MIN = 1000;
//手指向右滑动时的最小距离
WindowManager windowManager ;
private static int XDISTANCE_MIN =200;
//手指向上滑或下滑时的最小距离
private static final int YDISTANCE_MIN = 100;
//记录手指按下时的横坐标。
private float xDown;
//记录手指按下时的纵坐标。
private float yDown;
//记录手指移动时的横坐标。
private float xMove;
//记录手指移动时的纵坐标。
private float yMove;
//用于计算手指滑动的速度。
private VelocityTracker mVelocityTracker;
private int downLift;
private int downRight;
int distanceX = 0;
int distanceY = 0;
int ySpeed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
createVelocityTracker(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = event.getRawX();
yDown = event.getRawY();
//记录 触碰到屏幕的左右点
downLift = getWindow().getDecorView().getLeft();
downRight = getWindow().getDecorView().getRight();
//获取移动关闭页面的宽度 等于 页面宽度的3分之一
windowManager= (WindowManager)getSystemService(Context.WINDOW_SERVICE);
XDISTANCE_MIN =windowManager.getDefaultDisplay().getWidth()/3;
break;
case MotionEvent.ACTION_MOVE:
xMove = event.getRawX();
yMove = event.getRawY();
//滑动的距离
distanceX = (int) (xMove - xDown);
distanceY = (int) (yMove - yDown);
//获取顺时速度
ySpeed = getScrollVelocity();
//关闭Activity需满足以下条件:
//1.x轴滑动的距离>XDISTANCE_MIN
//2.y轴滑动的距离在YDISTANCE_MIN范围内
if (xDown > 150 || distanceX < 10) {
break;
}
getWindow().getDecorView().layout(downLift + distanceX, getWindow().getDecorView().getTop(), downRight + distanceX, getWindow().getDecorView().getBottom());
break;
case MotionEvent.ACTION_UP:
recycleVelocityTracker();
//如果起点 大于X大于50 不做响应
if (xDown > 150 || distanceX < 10) {
break;
}
//当滑动速度大于1000时 页面关闭
if(ySpeed>YSPEED_MIN){
finish();
overridePendingTransition(R.anim.out_not_move,R.anim.slide_right_out);
}
//滑动的距离大于 屏幕的3分之一 时候 页面关闭
if (distanceX > XDISTANCE_MIN && (distanceY < YDISTANCE_MIN && distanceY > -YDISTANCE_MIN)) {
finish();
overridePendingTransition(R.anim.out_not_move,R.anim.slide_right_out);
} else {
//页面回到起始点
slideview();
}
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
/**
* 创建VelocityTracker对象,并将触摸界面的滑动事件加入到VelocityTracker当中。
*
* @param event
*/
private void createVelocityTracker(MotionEvent event) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
}
/**
* 回收VelocityTracker对象。
*/
private void recycleVelocityTracker() {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
/**
* [url=home.php?mod=space&uid=309376]@return[/url] 滑动速度,以每秒钟移动了多少像素值为单位。
*/
private int getScrollVelocity() {
mVelocityTracker.computeCurrentVelocity(1000);
int velocity = (int) mVelocityTracker.getYVelocity();
return Math.abs(velocity);
}
/**
* 回到原来的位置动画
*/
public void slideview() {
new Thread(new Runnable() {
@Override
public void run() {
//起始位置加 活动的距离 等于 回到原点的长度 每次移动20个像素 每次5毫秒
int count = (downLift +distanceX) / 20+1;
for (int i = 0; i < count; i++) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
final int lenght = (downLift +distanceX)-(i*20);
runOnUiThread(new Runnable() {
@Override
public void run() {
//每次移动
getWindow().getDecorView().layout(0 + lenght, getWindow().getDecorView().getTop(), downRight + lenght, getWindow().getDecorView().getBottom());
}
});
}
runOnUiThread(new Runnable() {
@Override
public void run() {
getWindow().getDecorView().layout(0, getWindow().getDecorView().getTop(), downRight, getWindow().getDecorView().getBottom());
}
});
}
}).start();
}
}