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

相關文章
相關標籤/搜索