Snake是一个备受欢迎的滑动关闭库。其配置简单,无侵入性,可以轻松实现仿iOS滑动返回效果...
最新版本
| 模块 | snake | snake-compiler | snake-annotations |
|---|---|---|---|
| 最新版本 |
新版本更新内容
- 移除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集成步骤
方法一:动态配置
- 在需要开启滑动返回的Fragment类中添加注解 @EnableDragToClose
@EnableDragToClose()
public class FirstFragment extends Fragment {
- 在跳转至当前 Fragment 时,如果你的 Fragment 类继承自 android.app.Fragment ,则使用 Snake.newProxy(xx.class) 创建 Fragment 实例。
而如果你的 Fragment 类继承自 android.support.v4.app.Fragment ,则使用 Snake.newProxySupport(xx.class) 创建 Fragment 实例。
- 在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.Fragmentandroid.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表现一致,你还需要额外做一个工作:
- 重写
onCreateAnimation或onCreateAnimator接口 - 实现
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;
}
}
注意:在重写的onCreateAnimator或onCreateAnimation接口中,请使用Snake.wrap接口对父类实现进行包裹。否则,将导致设置无效,具体实现可以参照Demo实现
参考资料
Github:github.com/yuanhoujun/…
QQ交流群:288177681