Android 右滑退出当前Activity

SwipeBack

利用滑动手势退出当前Activityjava

License maven--central

Features

  • 不须要设置透明theme或windowIsTranslucent = true
  • 不影响activity的生命周期
  • 只需继承SwipeBackActivity
  • 支持Dialog的滑动返回

Getting started

Firstly,add the following lines to your app/build.gradle.git

dependencies {  
    compile 'com.aitangba:swipeback:1.0.1'
}

Secondly, add the following lines to your application.github

public class CustomApplication extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(ActivityLifecycleHelper.build());
    }

}

Finally, set the activity which need to swipe extends the SwipeBackActivity.api

public class BaseActivity extends SwipeBackActivity {

}

Usage

API

Application在Api14以后添加了新的Callback方法缓存

public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {

    }

这样就能够根据activity的生命周期缓存全部Activity,经过list获取上一个activity的实例,从而获取id为content的ContentView的子View(即setContentView中的View),并进行滑动展现。多线程

默认SwipeBackActivity是支持滑动返回的,不须要滑动返回时则须要复写SwipeBackActivity的方法supportSlideBack,其中方法canBeSlideBack意思是可否返回至本Activity;两个方法相互配合使用,以应对各类需求。app

public class SwipeBackActivity extends AppCompatActivity implements SwipeBackHelper.SlideBackManager {

    private static final String TAG = "SwipeBackActivity";

    private SwipeBackHelper mSwipeBackHelper;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if(mSwipeBackHelper == null) {
            mSwipeBackHelper = new SwipeBackHelper(this);
        }
        return mSwipeBackHelper.processTouchEvent(ev) || super.dispatchTouchEvent(ev);
    }

    @Override
    public Activity getSlideActivity() {
        return this;
    }

    @Override
    public boolean supportSlideBack() {
        return true;
    }

    @Override
    public boolean canBeSlideBack() {
        return true;
    }

    @Override
    public void finish() {
        if(mSwipeBackHelper != null) {
            mSwipeBackHelper.finishSwipeImmediately();
            mSwipeBackHelper = null;
        }
        super.finish();
    }
}

6种事件状态

private static final int MSG_ACTION_DOWN = 1; //点击事件  
    private static final int MSG_ACTION_MOVE = 2; //滑动事件
    private static final int MSG_ACTION_UP = 3;  //点击结束
    private static final int MSG_SLIDE_CANCEL = 4; //开始滑动,不返回前一个页面
    private static final int MSG_SLIDE_CANCELED = 5;  //结束滑动,不返回前一个页面
    private static final int MSG_SLIDE_PROCEED = 6; //开始滑动,返回前一个页面
    private static final int MSG_SLIDE_FINISHED = 7;//结束滑动,返回前一个页面
  1. 在Down手势发生时,只要将上一个Activity的ContentView从parentView中剥离,并加入到当前View的ContentView中;
  2. 在滑动手势发生时,加上阴影View,并进行滑动;同时滑动的有当前Activity的ContentView、上一个Activity的ContentView和自定义的阴影View;
  3. 在Up手势发生时,判断滑动是否超过半屏,触发返回操做,并展现滑动动画;
  4. 滑动取消或滑动返回发生时,须要将上个Activity的ContentView重新加入到上一个Acitivity的布局中。

Tips:
在设计过程当中遇到也有过其余思路:
1)设置Activity的透明theme,但是发现只要activity的层级变多就会变得很是卡顿;
2)动态设置Activity的theme,这须要经过反射,并且还须要判断api,部分手机还不兼容;
3)在滑动展现上个Activity的View时,直接将上个Activity的contentView截图保存在内存卡上,而后显示在当前Activity的view上,可是有明显的卡顿感;
以上都是在设计过程当中想到的方案,也逐个实践了一下,发现问题仍是比较多的,想一想还不如另辟蹊径,就有了如今的方案,目前看来仍是能兼容大部分手机的。maven

ScreenShot

image

Update

  • 1.0.1
    添加接口SlideBackManager;
    修正手势判断,仅在可滑动区域进行滑动手势判断,不干扰点击或长按事件;
    修复因为其余多线程在滑动页面进行中时,调用finish方法致使异常发生的问题

gitHub地址:https://github.com/XBeats/and_swipebackide

相关文章
相关标签/搜索