乐趣区

Bamboy右滑关闭2.0,无需透明主题的右滑关闭(附源码)

SlidingShut 右滑关闭
简介
很多 APP 中都会有右滑关闭功能,尤其是在全面屏时代更显得尤为重要,但是,Android 8.0 禁止非全屏的 Activity 使用透明主题,否则会引发:
Only fullscreen opaque activities can request orientation
这导致了体验最优的右滑关闭方案则不能再使用,除非有微信那种黑科技。
手机 QQ 的右滑关闭虽然不需要透明主题,但是没有实时反馈,体验巨差,那么就没有其他的选择了吗?
于是我总结了一下,目前最多的有两种右滑方案:
1、以微信为代表的透明方案

优点 1:界面移动跟随手指,实时反馈。优点 2:拟物化,层级明确,视觉体验好。——————————— 缺点 1:由于涉及到滑动速度,要滑多快才会触发关闭,这阈值永远是个未知数,再加上使用右滑关闭的 App 越来越多,每个 App 的这个阈值都不一样,无形中增加了关闭失败的几率 以及用户的思考成本。
缺点 2:需要透明主题,不仅有可能会扰乱上一个 Activity 的生命周期,而且 SDK 27 中非全屏 Activity 不可用,否侧会 crash。

2、以 QQ 为代表的滑动方向计算

优点:不需要透明主题 ——————————— 缺点 1:没有任何反馈,用户无法知道当前手势是否可以触发关闭,误触率高。缺点 2:反应迟钝,由于需要手势完成才能获得完整手势,所以手指抬起后才会触发关闭,虽然微信也是抬起后关闭,但是视觉上和心理上却不存在此缺点。不过有个稍优点的方案,实时计算手势的,反应灵敏了许多,但却会增加误触几率。
缺点 3:没有层级感,更不拟物化。

那么有没有其他的方案,既不需要透明主题,又能实时反馈?
当然,既然我写了这篇帖子,那么当然会给大家提供一种方案。
3:Bamboy 右滑关闭方案

优点 1:不需要透明主题。优点 2:界面跟随手指,实时反馈,会不会关闭用户一目了然。
优点 3:拟物化,视觉体验好。——————————— 缺点:没有微信的那种方案层级感强。

废话不多说,这就给大家展示一下效果吧:
一、抬起模式
顾名思义 滑动过程中圆环进度条跟随手指而充盈 当圆环圆满后 抬起手指后才会触发 finish();
想要使用抬起模式 调用以下代码即可:
setUpFinish(true);
(注:默认为 true,即默认抬起模式)

二、即刻模式
与抬起模式相对应 只要圆环圆满就触发 finish(); 相比来说 即刻模式更敏捷 但却存在误触的情况 选择适合自己的
想要使用抬起模式 调用以下代码即可:
setUpFinish(false);

三、兼容 finish() 被拦截的情况
当 Activity 中 finish() 方法被拦截时 已经移动的界面自动归位 归位后自动重新开启右滑关闭

四、指定滑动 View
看了上面几个动图 心细的朋友可能发现了 在界面移动时 Activity 左上角出现了一个白条条 这是因为 TitleBar 的颜色和界面的颜色不一致导致的 虽说无伤大雅 但作为一个视觉主义的程序员 这个小细节也是要优化的 所以我提供了只移动指定 View 功能 就是说不会整个界面都移动 你让他动的才会动
想要指定滑动 View 调用以下代码即可:
setMoveView(rootView);

五、圆环颜色自定义
不管是出于性能 还是出于可扩展性 这个圆环进度条是完全用 Canvas 画出来的 所以颜色当然是支持自定义的 比如界面背景色不是白色 而是主题色时
想要指定圆环颜色 调用以下代码即可:
int color = ContextCompat.getColor(context, R.color.white);
setProgressColor(color);

尘少老规矩,附源码:https://github.com/Bamboy1203…
也可以先扫码下载 apk 安装体验:同时欢迎加入技术探讨 QQ 群:569614530

退出移动版