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

    首先,我们所需要的效果是当手指向右滑动的时候,当前的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

                   

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


转载请注明出处!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值