您的位置:首页 > 移动开发 > Android开发

Android实现IOS向右滑动退出当前Activity

2016-04-24 21:08 1516 查看
    首先,我们所需要的效果是当手指向右滑动的时候,当前的activity跟随手指移动,上一个activity也要跟随移动,只是速度稍慢,我们知道,activity有一个getWindow.getDecorView()方法,我们也知道这个方法的返回值是activity的根view,所以我们只需要那个这个根View的引用,同时移动这个View就ok了,其中有一个细节就是,我们需要把activity的根View的引用做一个全局的缓存,或者是在Onpause方法调用的时候缓存起来,我想,说道这里,已经有很多人知道该怎么做了,那在下就不废话了,直接上代码吧。

<span style="font-size:18px;">package com.example.activityanimotion;

import android.app.Activity;
import android.os.Handler;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class ActivityFinishUtils {

// 当前activity布局的根View,用于设置touch监听事件
private View view;
private GestureDetector detector;
private int verticalMinDistance = 20;

private int minVelocity = 0;
// 上一层view对象
private View mLastView;
// 当前view移动距离
private int mdistance = 0;
// 上一层view初始移动距离
private int mlastX = 0;
// 上一层view移动的距离
private int mLastDistance = 0;
// 当前的View
private View currentView;

private Activity mContext;

public void Init(Activity context, View view, OnGestureListener listener) {
verticalMinDistance = 20;
minVelocity = 0;
mdistance = 0;
mlastX = 0;
mLastDistance = 0;
mContext = context;
detector = new GestureDetector(mContext, listener);
this.view = view;
currentView = mContext.getWindow().getDecorView();
this.view.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub

if (arg1.getAction() == MotionEvent.ACTION_UP) {
if (mdistance < currentView.getWidth() / 2) {
mLastView.scrollBy(mLastDistance - mlastX, 0);
currentView.scrollBy(mdistance, 0);
mdistance = 0;
mLastDistance = mlastX;
} else {

mContext.finish();
new Handler().postDelayed(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
mLastView.scrollBy(mLastDistance, 0);

}
}, 120);

}
} else if (arg1.getAction() == MotionEvent.ACTION_DOWN) {

// currentView = mContext.getWindow().getDecorView();
}
return ActivityFinishUtils.this.detector.onTouchEvent(arg1);

}
});

this.view.setClickable(true);
this.view.setLongClickable(true);
new Handler().postDelayed(new Runnable() {

@Override
public void run() {</span>
<span style="font-size:18px;">                                //我这里是在activity跳转的时候穿了classname,便于获得上一个activity的根view的引用,</span>
<span style="font-size:18px;">                                 当然也可以从activity栈中区获取,这里是为了在activity进入的时候将上一个activity先向左yidong</span>
<span style="font-size:18px;">                                 一半的距离,为了滑动的时候视觉上有速度的差别
String classname = mContext.getIntent().getStringExtra(
"classname");
if (classname != null) {
// TODO Auto-generated method stub
mLastView = MainApplication.views.get(classname);
if (mLastView != null) {

mLastView.scrollBy(mLastView.getWidth() / 2, 0);
mLastDistance = -(mLastView.getWidth() / 2);
mlastX = -(mLastView.getWidth() / 2);
}
}
}
}, 500);
}

public void onBackPress() {
// 按返回键返回时将上一层view归位
mLastView.scrollBy(mLastDistance, 0);
}

// 监听滚动
public void OnScroll(MotionEvent e1, MotionEvent e2, float velocityX) {

// 向左移动
if (e1.getX() - e2.getX() > verticalMinDistance
&& Math.abs(velocityX) > minVelocity) {

if (mdistance > 0) {

float distance = e1.getX() - e2.getX();

currentView.scrollBy((int) distance, 0);
mLastView.scrollBy((int) distance / 2, 0);
mLastDistance -= (int) distance / 2;
mdistance -= (int) distance;

}
} // 向右移动
else if (e2.getX() - e1.getX() > verticalMinDistance
&& Math.abs(velocityX) > minVelocity && e1.getX() <= 20) {

float distance = e2.getX() - e1.getX();
currentView.scrollBy(-(int) distance, 0);
mLastView.scrollBy(-(int) (distance / 2), 0);
mLastDistance += (int) (distance / 2);
mdistance += (int) distance;
if (mdistance >= currentView.getWidth()) {
mLastView.scrollBy(mLastDistance, 0);
mContext.finish();
}
}
}
}
</span>

需要注意的:1.需要滑动返回的activity背景记得设为透明,否则将看不见上一个activity
                   

如果各位大神有什么更好的实现方式,欢迎留言交流!!

转载请注明出处!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android开发