使用Snake,Android也可以轻松实现类iOS侧滑返回效果
Clone or download
Latest commit 2458afb Jul 11, 2018

README.md

Snake

最新版本

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

特性介绍

  • 同时支持ActivityFragmentWebView
  • 使用简单,无侵入性
  • 配置灵活,可以满足各种业务需求
  • 适配SDK Version >= 14以上所有机型,无副作用

Demo下载体验

扫描图中二维码下载

扫描上方二维码 或 直接点这里下载

更新日志

使用方法

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实现

WebView滑动控制

如果希望WebView也开启滑动控制功能,修改你的WebView类为SnakeWebView即可。目前,暂时只支持快速向左轻扫前进,快速向右轻扫回退。

Best Practice

1)Activity的启动是一个耗时的过程,为了体验效果更佳,推荐使用全Fragment设计,或者说Activity+多Fragment设计。 另外,由于Android系统的兼容性问题,在SDK版本低于21的机型中,Activity的关闭将使用快速右滑手势,只有在高于21的机型中, 才能使用联动拖拽的方式进行滑动关闭。

2)建议在Activity和Fragment基类中使用@EnableDragToClose注解,这可以避免在子类中频繁使用注解设置。Activity的托管也建议在父类中完成。

3)不推荐对滑动样式进行自定义设置,默认样式在UI体现上已经比较漂亮,繁琐的设计反而会干扰你的理解。

4)遇到问题请先查看Wiki,看是否有你想要的答案。如果没有,请添加QQ交流群288177681及时反馈。

5)虽然不设置窗体透明属性也可以使用,但依然推荐手动设置窗体透明,以获得更好体验。具体做法,复制下面属性设置到你的style.xml文件主题配置中:

<item name="android:windowIsTranslucent">true</item>

混淆配置

# 如果已经应用该规则,无需重复配置
-keepattributes *Annotation*
-keep class **.*_SnakeProxy
-keep @com.youngfeng.snake.annotations.EnableDragToClose public class *

追踪Snake动态,关注欧阳锋工作室

欧阳锋工作室

唯一官方QQ交流群

QQ群:288177681

如果你在使用过程中遇到了任何问题,欢迎加群交流。如果你想给作者支持,请点击上方star支持。

PS: 如果你在产品中使用了Snake, 请来信告诉我!邮件地址:626306805@qq.com,非常感谢!

License

Copyright 2018 Ouyangfeng Office

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.