现在很多Android应用上都增加了Activity右滑退出的效果,这个效果最早来源于iOS,这样的操作优化确实提升了用户体验。所以目前很多App在Android上也新增了这一功能,例如简书、酷狗音乐等,今天我就来学习一下可以实现这个功能的开源框架SwipeBackLayout。
下面先看一下具体效果图:
SwipeBackLayout的使用方法
首先在开发前将SwipeBackLayout开源库添加到项目中,添加库的方式有两种:
- 直接添加库文件
- 添加依赖 compile 'me.imid.swipebacklayout.lib:library:1.0.0'
之后我们写一个基类Activity继承自库中的SwipeBackActivity,代码如下:
public class BaseActivity extends SwipeBackActivity {
private SwipeBackLayout mSwipeBackLayout;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
// 可以调用该方法,设置是否允许滑动退出
setSwipeBackEnable(true);
mSwipeBackLayout = getSwipeBackLayout();
// 设置滑动方向,可设置EDGE_LEFT, EDGE_RIGHT, EDGE_ALL, EDGE_BOTTOM
mSwipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_LEFT);
// 滑动退出的效果只能从边界滑动才有效果,如果要扩大touch的范围,可以调用这个方法
//mSwipeBackLayout.setEdgeSize(200);
}
}
然后我们就可以写自己的Activity了,只要继承自BaseActivity就可以了,为了测试一下效果我写了三个非常简单的Activity,在此也就不贴代码了。到此所有工作就结束了,下面我就开始跑程序了,效果如下图所示:
这个时候我们可以很清楚的看到效果和我们想象的并不一样,在向右滑动时上一个Activity变成了黑屏,通过查阅资料得知,我们还需要在AppTheme中添加一个属性:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:windowIsTranslucent">true</item>
</style>
并在清单文件中设置这个Theme,然后我再跑一次程序试了一下,依旧还是出现上述情况,这是为什么呢?原来我们需要将主界面MainActivituy主题的windowIsTranslucent设置为false,而其他Activity设置为true,因此我又添加了一个样式:
<style name="AppThemeMain" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:windowIsTranslucent">false</item>
</style>
然后在清单文件中进行相应的配置,测试成功,效果如图1所示。
windowIsTranslucent属性
程序测试完成之后我想为Activity之间的跳转添加一些动画,所以我又写了一下代码:
<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>
但是我惊奇的发现这些动画竟然不起作用,几经波折终于找到了解决方法,解决办法就是,windowAnimationStyle需要继承Animation.Translucent,一般情况是继承的Animation.Activity,这是由于windowIsTranslucent这个属性设置为了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>
至此测试成功!
以上Demo是在Android4.4系统进行测试的,后来我在5.0以上系统上测试发现,不设置windowIsTranslucent属性也是可以的,但是4.4系统是不行的,所以个人认为,为了适配还是尽量按照以上做法来开发比较好。好了,到此我的学习就结束了,还是有很多东西需要学习的啊,欢迎大家指导建议。