現(xiàn)在很多Android應(yīng)用上都增加了Activity右滑退出的效果,這個(gè)效果最早來(lái)源于iOS,這樣的操作優(yōu)化確實(shí)提升了用戶體驗(yàn)。所以目前很多App在Android上也新增了這一功能,例如簡(jiǎn)書(shū)、酷狗音樂(lè)等,今天我就來(lái)學(xué)習(xí)一下可以實(shí)現(xiàn)這個(gè)功能的開(kāi)源框架SwipeBackLayout。
下面先看一下具體效果圖:

SwipeBackLayout的使用方法
首先在開(kāi)發(fā)前將SwipeBackLayout開(kāi)源庫(kù)添加到項(xiàng)目中,添加庫(kù)的方式有兩種:
- 直接添加庫(kù)文件
- 添加依賴 compile 'me.imid.swipebacklayout.lib:library:1.0.0'
之后我們寫(xiě)一個(gè)基類Activity繼承自庫(kù)中的SwipeBackActivity,代碼如下:
public class BaseActivity extends SwipeBackActivity {
private SwipeBackLayout mSwipeBackLayout;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
// 可以調(diào)用該方法,設(shè)置是否允許滑動(dòng)退出
setSwipeBackEnable(true);
mSwipeBackLayout = getSwipeBackLayout();
// 設(shè)置滑動(dòng)方向,可設(shè)置EDGE_LEFT, EDGE_RIGHT, EDGE_ALL, EDGE_BOTTOM
mSwipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_LEFT);
// 滑動(dòng)退出的效果只能從邊界滑動(dòng)才有效果,如果要擴(kuò)大touch的范圍,可以調(diào)用這個(gè)方法
//mSwipeBackLayout.setEdgeSize(200);
}
}
然后我們就可以寫(xiě)自己的Activity了,只要繼承自BaseActivity就可以了,為了測(cè)試一下效果我寫(xiě)了三個(gè)非常簡(jiǎn)單的Activity,在此也就不貼代碼了。到此所有工作就結(jié)束了,下面我就開(kāi)始跑程序了,效果如下圖所示:
這個(gè)時(shí)候我們可以很清楚的看到效果和我們想象的并不一樣,在向右滑動(dòng)時(shí)上一個(gè)Activity變成了黑屏,通過(guò)查閱資料得知,我們還需要在AppTheme中添加一個(gè)屬性:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:windowIsTranslucent">true</item>
</style>
并在清單文件中設(shè)置這個(gè)Theme,然后我再跑一次程序試了一下,依舊還是出現(xiàn)上述情況,這是為什么呢?原來(lái)我們需要將主界面MainActivituy主題的windowIsTranslucent設(shè)置為false,而其他Activity設(shè)置為true,因此我又添加了一個(gè)樣式:
<style name="AppThemeMain" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:windowIsTranslucent">false</item>
</style>
然后在清單文件中進(jìn)行相應(yīng)的配置,測(cè)試成功,效果如圖1所示。
windowIsTranslucent屬性
程序測(cè)試完成之后我想為Activity之間的跳轉(zhuǎn)添加一些動(dòng)畫(huà),所以我又寫(xiě)了一下代碼:
<style name="anim_activity" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/activity_open_in_anim</item>
<item name="android:activityOpenExitAnimation">@anim/activity_open_out_anim</item>
<item name="android:activityCloseEnterAnimation">@anim/activity_close_in_anim</item>
<item name="android:activityCloseExitAnimation">@anim/activity_close_out_anim</item>
</style>
但是我驚奇的發(fā)現(xiàn)這些動(dòng)畫(huà)竟然不起作用,幾經(jīng)波折終于找到了解決方法,解決辦法就是,windowAnimationStyle需要繼承Animation.Translucent,一般情況是繼承的Animation.Activity,這是由于windowIsTranslucent這個(gè)屬性設(shè)置為了true,然后我將代碼改為:
<style name="animation_translucent_translate" parent="@android:style/Animation.Translucent">
<item name="android:windowEnterAnimation">@anim/activity_open_in_anim</item>
<item name="android:windowExitAnimation">@anim/activity_open_out_anim</item>
</style>
至此測(cè)試成功!
以上Demo是在Android4.4系統(tǒng)進(jìn)行測(cè)試的,后來(lái)我在5.0以上系統(tǒng)上測(cè)試發(fā)現(xiàn),不設(shè)置windowIsTranslucent屬性也是可以的,但是4.4系統(tǒng)是不行的,所以個(gè)人認(rèn)為,為了適配還是盡量按照以上做法來(lái)開(kāi)發(fā)比較好。好了,到此我的學(xué)習(xí)就結(jié)束了,還是有很多東西需要學(xué)習(xí)的啊,歡迎大家指導(dǎo)建議。