SwipeBack
在設(shè)計過程中遇到也有過其他思路:
1)設(shè)置Activity的透明theme亏娜,可是發(fā)現(xiàn)只要activity的層級變多就會變得非沉粼埽卡頓卷雕;
2)動態(tài)設(shè)置Activity的theme呀酸,這需要通過反射客给,而且還需要判斷api韩容,部分手機還不兼容齐婴;
3)在滑動展示上個Activity的View時单匣,直接將上個Activity的contentView截圖保存在內(nèi)存卡上蚁阳,然后顯示在當(dāng)前Activity的view上铃绒,但是有明顯的卡頓感;
以上都是在設(shè)計過程中想到的方案螺捐,也逐個實踐了一下匿垄,發(fā)現(xiàn)問題還是比較多的,想想還不如另辟蹊徑归粉,就有了現(xiàn)在的方案椿疗,目前看來還是能兼容大部分手機的。
Features
- 不需要設(shè)置透明theme或
windowIsTranslucent = true
- 不影響activity的生命周期
- 只需繼承SwipeBackActivity
- 支持Dialog的滑動返回
Getting started
Firstly, add the following lines to your app/build.gradle.
dependencies {
compile 'com.aitangba:swipeback:1.0.0'
}
Secondly, add the following lines to your application.
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.
public class BaseActivity extends SwipeBackActivity {
}
Usage
API
Application在Api14之后添加了新的Callback方法
public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
}
這樣就可以根據(jù)activity的生命周期緩存所有Activity糠悼,通過list獲取上一個activity的實例届榄,從而獲取id為content的ContentView的子View(即setContentView中的View),并進行滑動展示倔喂。
默認(rèn)SwipeBackActivity是支持滑動返回的铝条,不需要滑動返回時則需要復(fù)寫SwipeBackActivity的方法supportSlideBack
,其中方法canBeSlideBack
意思是能否返回至本Activity席噩;兩個方法相互配合使用班缰,以應(yīng)對各種需求。
public class SwipeBackActivity extends AppCompatActivity {
private SwipeWindowHelper mSwipeWindowHelper;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(!supportSlideBack()) {
return super.dispatchTouchEvent(ev);
}
if(mSwipeWindowHelper == null) {
mSwipeWindowHelper = new SwipeWindowHelper(getWindow());
}
return mSwipeWindowHelper.processTouchEvent(ev) || super.dispatchTouchEvent(ev);
}
/**
* 是否支持滑動返回
* @return
*/
protected boolean supportSlideBack() {
return true;
}
/**
* 能否滑動返回至當(dāng)前Activity
* @return
*/
protected boolean canBeSlideBack() {
return true;
}
}
6種事件狀態(tài)
private static final int MSG_ACTION_DOWN = 1; //點擊事件
private static final int MSG_ACTION_MOVE = 2; //滑動事件
private static final int MSG_ACTION_UP = 3; //點擊結(jié)束
private static final int MSG_SLIDE_CANCEL = 4; //開始滑動悼枢,不返回前一個頁面
private static final int MSG_SLIDE_CANCELED = 5; //結(jié)束滑動埠忘,不返回前一個頁面
private static final int MSG_SLIDE_PROCEED = 6; //開始滑動,返回前一個頁面
private static final int MSG_SLIDE_FINISHED = 7;//結(jié)束滑動,返回前一個頁面
- 在Down手勢發(fā)生時莹妒,只要將上一個Activity的ContentView從parentView中剝離名船,并加入到當(dāng)前View的ContentView中;
- 在滑動手勢發(fā)生時旨怠,加上陰影View渠驼,并進行滑動;同時滑動的有當(dāng)前Activity的ContentView鉴腻、上一個Activity的ContentView和自定義的陰影View迷扇;
- 在Up手勢發(fā)生時,判斷滑動是否超過半屏爽哎,觸發(fā)返回操作蜓席,并展示滑動動畫;
- 滑動取消或滑動返回發(fā)生時倦青,需要將上個Activity的ContentView從新加入到上一個Acitivity的布局中。
ScreenShot
gitHub地址:github.com/XBeats/and_swipeback