关于SwipeBackLayout的使用以及那些坑

现在很多Android应用上都增加了Activity右滑退出的效果,这个效果最早来源于iOS,这样的操作优化确实提升了用户体验。所以目前很多App在Android上也新增了这一功能,例如简书、酷狗音乐等,今天我就来学习一下可以实现这个功能的开源框架SwipeBackLayout。
下面先看一下具体效果图:

《关于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,在此也就不贴代码了。到此所有工作就结束了,下面我就开始跑程序了,效果如下图所示:

《关于SwipeBackLayout的使用以及那些坑》

这个时候我们可以很清楚的看到效果和我们想象的并不一样,在向右滑动时上一个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系统是不行的,所以个人认为,为了适配还是尽量按照以上做法来开发比较好。好了,到此我的学习就结束了,还是有很多东西需要学习的啊,欢迎大家指导建议。

    原文作者:iflymoon
    原文地址: https://www.jianshu.com/p/7660bd03a930
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞