Snake版本升级,去掉host接口...

350 阅读6分钟

Snake是一个备受欢迎的滑动关闭库。其配置简单,无侵入性,可以轻松实现仿iOS滑动返回效果...

最新版本

模块 snake snake-compiler snake-annotations
最新版本
Download
Download
Download

新版本更新内容

  • 移除host接口,简化Activity配置
  • 修复偶见情况下滑动卡顿问题
  • 增加混淆配置说明

使用方法

1)添加依赖

dependencies {
    // Gradle高版本这里可以使用implementation代替compile
    // x.x.x代表上方表格中对应模块最新版本
    compile 'com.youngfeng.android:snake:x.x.x'
    annotationProcessor 'com.youngfeng.android:snake-compiler:x.x.x'
}

注:如果使用Kotlin,请将annotationProcessor修改为kapt

2)在Application中对Snake进行初始化

public class SnakeApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        
        // 对Snake进行初始化
        Snake.init(this);
    }
}

Activity集成步骤

在需要开启滑动返回的Activity类中添加注解 @EnableDragToClose即可

@EnableDragToClose()
public class FirstActivity extends Activity

Fragment集成步骤

方法一:动态配置

  1. 在需要开启滑动返回的Fragment类中添加注解 @EnableDragToClose
@EnableDragToClose()
public class FirstFragment extends Fragment {
  1. 在跳转至当前 Fragment 时,如果你的 Fragment 类继承自 android.app.Fragment ,则使用 Snake.newProxy(xx.class) 创建 Fragment 实例。

而如果你的 Fragment 类继承自 android.support.v4.app.Fragment ,则使用 Snake.newProxySupport(xx.class) 创建 Fragment 实例。

  1. Fragment中,可能不存在默认构造方法。或者使用了多个构造方法,这个时候你可以使用PrimaryConstructor指定主构造方法。
@EnableDragToClose()
public class FirstFragment extends Fragment {
    
    @PrimaryConstructor
    public FirstFragment(int x, int y) {
        
    }
    
    ...
}

在使用了主构造器的情况下,使用Snake.newProxy接口创建实例的时候需要传入构造参数,以上述代码片段为例,可以这样使用:

FirstFragment fragment = Snake.newProxy(FirstFragment.class, 1, 2);

Snake.newProxySupport接口同理

方法二:使用继承

按照下面的对应关系,改变你的Fragment父类就可以完成滑动关闭集成:

  • android.app.Fragment => com.youngfeng.snake.app.Fragment
  • android.support.v4.app.Fragment => com.youngfeng.snake.support.v4.app.Fragment

两种集成方案的区别

集成方案 newProxy/newProxySupport 使用继承
侵入性 改变了顶级父类
难易程度 较为复杂 简单
动画处理 需要自行处理 不需要处理
实例创建 必须使用接口newProxy/newProxySupport 可以自行处理

注意:使用继承方式集成的情况下,原来的API完全可以通用。你可以选择使用Snake的API进行滑动控制,也可以使用父类中的方法进行滑动控制,这取决于你自己。甚至实例创建你依然可以交给newProxy/newProxySupport接口。

一点建议:如果你的工程有一致的编程规范,代码工整,我推荐你使用继承的方式集成。如果你的工程相对较乱,整体表现不一致,我推荐你使用newProxy/newProxySupport方式集成,灵活性更高。

滑动参数配置

通常情况下,完成上面的步骤,你已经可以正常使用滑动关闭功能了。可是,有些同学可能希望对滑动样式进行定制化。别担心, Snake提供了两种方式对滑动参数进行配置。

  • 全局滑动参数配置 如果你希望对所有页面应用滑动参数配置,可以使用snake.xml文件对参数进行配置,在工程的根目录下面,我提供了配置模板
<?xml version="1.0" encoding="utf-8"?>
<snake>
    <config>
        <!-- 设置为true,根Activity也能够滑动关闭,这很奇怪!不建议修改这个变量的默认值 -->
        <enable_for_root_activity>false</enable_for_root_activity>
        <!-- 设置为true,将监听当前页面所有位置往右快速滑动手势 -->
        <only_listen_to_fast_swipe>false</only_listen_to_fast_swipe>
        <!-- 快速滑动最低检测速度,不建议修改。过高会影响灵敏度,过低会导致误判 -->
        <min_velocity>2000</min_velocity>
        <!-- 设置为true,滑动时左侧边缘阴影将被隐藏, 这个变量的默认值也不建议修改 -->
        <hide_shadow_of_edge>false</hide_shadow_of_edge>
        <!-- 阴影边缘渐变色起始颜色 -->
        <shadow_start_color>#00000000</shadow_start_color>
        <!-- 阴影边缘渐变色结束颜色 -->
        <shadow_end_color>#50000000</shadow_end_color>
        <!-- 类似iPhone X, 从底部边缘快速上滑回到桌面 (实验性功能,默认关闭) -->
        <enable_swipe_up_to_home>false</enable_swipe_up_to_home>
        <!-- 是否允许页面联动,默认为true -->
        <allow_page_linkage>true</allow_page_linkage>
    </config>
</snake>

修改模板参数,复制当前xml文件,放到主工程目录的assets下面即可,名称必须依然是snake.xml,不能修改!

  • 单页面参数配置 如果你只希望对单个页面应用滑动参数配置,可以使用**@SetDragParameter**对其进行配置:
@EnableDragToClose()
@SetDragParameter(minVelocity = 2000, hideShadowOfEdge = false ...)
public class FirstActivity extends Activity

其它接口介绍

Snake.enableDragToClose():如果你希望动态开启或关闭【滑动关闭】特性,可以使用该接口

Snake.addDragListener():如果你希望在滑动过程中进行一些额外的处理,可以使用该接口监听整个滑动过程。

Snake.setCustomTouchInterceptor:如果你在使用过程中,出现了一些滑动冲突问题,你可以通过使用该接口自定义拦截器解决。 注意:大多数情况下你不需要理会该接口,如果确定是需要解决这种滑动冲突问题,可以使用该接口。

Snake.dragToCloseEnabled():如果你需要知道滑动关闭功能在当前页面是否处于开启状态,可以使用该接口。

Snake.enableSwipeToHome(): 如果希望在某个页面开启上滑退出到桌面功能,可以使用该接口

Snake.swipeUpToHomeEnabled(): 获取当前页面上滑退出到桌面功能开启状态

动画处理

至此,你已经成功集成了滑动关闭功能,并且也知道了如何配置滑动关闭参数。可是,你会发现,如果使用系统返回键,Activity的 动画表现和滑动关闭不一致,有些不协调。另外,Fragment似乎在滑动关闭后还会再播放一次动画,看起来很奇怪。

为此,Snake提供了几种不同的动画实现和滑动关闭动画配合使用,使其看起来是完全一致的。

  • R.anim.snake_slide_in_left.xml: 从左进入
  • R.anim.snake_slide_in_right.xml: 从右进入
  • R.anim.snake_slide_out_left.xml:从左退出
  • R.anim.snake_slide_out_right.xml:从右退出
  • R.animator.snake_slide_in_left.xml: 从左进入
  • R.animator.snake_slide_in_right.xml: 从右进入
  • R.animator.snake_slide_out_left.xml:从左退出
  • R.animator.snake_slide_out_right.xml:从右退出

具体使用方法,可以参照Demo配置。

Activity启动和关闭的时候,使用这几种动画配置基本就解决了滑动关闭的动画样式不一致问题。可是,Fragment的动画 重复播放问题依然存在。为了使Fragment表现一致,你还需要额外做一个工作:

  • 重写onCreateAnimationonCreateAnimator接口
  • 实现SnakeAnimationController接口

推荐在Fragment基础父类中做这项工作,具体实现后的效果如下:

public class BaseFragment extends Fragment implements SnakeAnimationController {
    private boolean mDisableAnimation;

    @Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
        return Snake.wrap(super.onCreateAnimator(transit, enter, nextAnim), this);
    }

    @Override
    public void disableAnimation(boolean disable) {
        mDisableAnimation = disable;
    }

    @Override
    public boolean animationDisabled() {
        return mDisableAnimation;
    }
}

注意:在重写的onCreateAnimatoronCreateAnimation接口中,请使用Snake.wrap接口对父类实现进行包裹。否则,将导致设置无效,具体实现可以参照Demo实现

参考资料

Github:github.com/yuanhoujun/…

QQ交流群:288177681