前情提要

在上一篇文章(关于知乎的“下一个回答”按钮(一)问题出在哪里?)中我们发现,知乎的“下一个回答”小球按钮拖拽手感极差。

通过慢镜头得知,我们可以拖拽小球,但小球离手之后并没有依照惯性被“扔”出去,而是立即停止了运动。我们的期望是,小球会按照惯性,再往我拖拽的方向前进一段距离。

最后,通过 Spring 动画的方式,我们生成了一个动画曲线,在一个简易的原型中,模拟出了小球在被抛出后的减速过程。


动画与曲线

首先我们对比 Spring 动画、线性动画和淡入淡出:

https://www.zhihu.com/video/1062917706021380096

其中线性动画是最单调无趣的,它的动画曲线(一条笔直的曲线)自始至终毫无波澜:

线性动画:Y = X

没有速度变化的动画,对用户而言,每一秒(本文应该精确到毫秒才对)都是煎熬。

相比之下,淡入淡出要有趣得多了。淡入淡出的过程可以描述为:速度为 0 - 加速 - 匀速 - 减速 - 速度为 0。我们可以观察它的曲线:

通过曲线控制动画:淡入淡出

通过虚线,曲线和两个蓝色的点连接在一起,通过改变这两个蓝色的控制点的位置,我们可以改变曲线的形状。如果把控制点分别拖到左下角和右上角,动画就变成了线性。

通过拖拽这两个控制点,甚至加入更多的控制点,我们可以制造任意形状的曲线。不光可以淡入或者淡出,还可以控制加速、减速的快慢,还可以让动画倒放。

通过仔细的调校,我们甚至……甚至可以模拟出物体运动的真实的物理效果!但调参是缓慢而痛苦的过程,幸好已经有人替我们调好了,那就是 Spring 动画。

上面的视频中的红色小圆,它的「去」和「来」的动画分别用了不同的 Spring 参数:

(左)红圆向右移动的曲线,以及(右)向左移动的曲线

较小的摩擦力带来了更快的速度,甚至有回弹的效果。


为什么选择 Spring?

在上面的例子中,Spring 动画具有非常快的启动速度。现在已经 2018 年了,花里胡哨的动画只会显得很土,所有的视觉元素都应当为你的内容服务,简单、高效。

除此之外,如果对比 Spring 动画的曲线与其他动画的曲线,你会发现 Spring 的曲线是没有尽头的:

坐标轴没有 0 到 1 的范围

通过结尾处平滑的曲线,过渡到最终的无尽的直线,比如我又用 Spring 做了这个示例:

https://www.zhihu.com/video/1062913756752928768

平滑的过渡带给 Spring 动画完美、自然的收尾,你看不出动画具体是在哪一瞬间结束的,这就是 Spring 动画的「连贯性」。

你应该用「连贯性」来指导你的一切视觉设计,具备这种性质的视觉元素,可以在不同的 App 中反复使用,不用担心会带来什么不协调感。


一些简单的计算

该写点代码了。

其实我早就写好了,在这里:Zhihu Floating Next - GitHub Repository

我们首先要做的是:根据小球脱手时的速度,与小球运动时收到的摩擦力,计算出小球将会发生的位移

所以问题就来了:第一,速度和摩擦力是多少;第二,怎么根据速度和摩擦力求出位移。

速度是已知的,因为 App 由你控制,你只要测量出用户的手指在离开屏幕时的速度就行……测量听着好像很麻烦,实际上 iOS 已经内置这个方法啦。

手机屏幕是个二维空间,速度是一个向量。如果你还记得初中物理的内容,二维空间中的向量,可以分解为一个 x 轴上的标量和一个 y 轴上的标量。所以速度是用 (x, y) 的向量形式表示的。

然后摩擦力是多少呢?摩擦力多大就由你来决定了。你的 App 是木头做的,黄油做的,还是像知乎一样是砂纸做的?

虽然说是由开发者自己决定,但选择怎样的值可以让用户感觉生动自然呢?总之砂纸是不行的,我们有知乎前车之鉴。好在 iOS 为我们提供了一个大家都习惯的取值,这个值来自 UIScrollView,来自你手机的「设置」、「通讯录」等一切可以滚动的视图。

手指划过屏幕,列表开始滚动,然后渐渐减速,直到停止。这是个广大人民群众喜闻乐见的减速效果,是苹果多年来为我们培养好的用户习惯,而我们只要拿来用就完事儿了。

最后就是位移的计算,直接先看代码:

let decelerationRate = UIScrollView.DecelerationRate.normal.rawValue
let projection = (x: x + (velocity.x / 1000.0) * decelerationRate / (1.0 - decelerationRate),y: y + (velocity.y / 1000.0) * decelerationRate / (1.0 - decelerationRate)
)

第一行代码我们取得了 iOS 为我们提供的减速率,可以认为就是我们要的「摩擦力」,这个 decelerationRate 的值是 0.998。

之后的几行,我们通过苹果提供的公式计算出了 x 轴上的位移和 y 轴上的位移:

将位移加到原坐标点上,计算出了最终的坐标。


代码实现动画

知道了小球的目标坐标,我们就可以用动画来移动它了:

let parameters = UISpringTimingParameters(dampingRatio: 0.98)
let animator = UIViewPropertyAnimator(duration: 1, timingParameters: parameters)
animator.addAnimations(animation)

iOS 提供了很多种实现 Spring 动画的方式,上面代码用的是其中比较简单的一种。

dampingRatio 取值范围是 [0.0, 1.0],值越小,小球就越容易跑过头,然后在终点处来回弹跳。一般情况下选把值设置为 1.0 或者接近 1.0 就行,避免不必要的动画干扰用户。

然后我们启动这个 animator:

animator.startAnimation()

除了减速之外,我还给小球的活动空间做了个小限制,距离顶部和底部 120 点,距离屏幕两侧 42 点。也加上了知乎原有的、让小球吸附在屏幕左右两侧的功能。

具体细节可以代码:Zhihu Floating Next - GitHub Repository。或者我再写一篇文章?大家觉得有必要吗,欢迎你在评论区留言。

总之最后的效果是这样:

https://www.zhihu.com/video/1062913870171103232

底部按钮吸附_知乎的药丸按钮(二)我的 iOS 实现相关推荐

  1. button按钮样式_各种好看的小按钮合集,纯css编写,最近在学习时遇到的,记录成为笔记...

    写在前面 最近忙着实习的事,前往广州,租房,置办东西等等.用碎片化的时间看了一些博客,也看到不少我认为很不错的通过纯css来打造的按钮样式.记录下来以后开发的时候或许能用上. 亮起来按钮 < 简 ...

  2. html按钮样式_一组强大的CSS3 Material 按钮

    插件简介 今天我们要给大家带来一组很漂亮的CSS3按钮,按钮的整体风格采用Material设计样式,非常简洁和清新.在这组CSS3按钮中,样式各种各样,有圆形按钮,也有带小图标的按钮,当然颜色也有很多 ...

  3. shazam 算法_类似于Shazam的变形按钮效果

    shazam 算法 View demo 查看演示Download Source 下载源 Today we'd like to show you how to create a fun little m ...

  4. 知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取.

    知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取. JDGSL4 YPHPV4 CJGYB4 NGXSL4 NNBUJ4 GUEJG4

  5. ueditor 添加按钮不显示_不可思议按键精灵的按钮选择框居然这么简单

    金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚 ...

  6. qtmessagebox对话框里自定义按钮文本_按钮你可以这样设计

    作者:Michal Malewicz 译者:Matrix 审稿:afang 原文链接: https://uxdesign.cc/design-better-buttons-a5c90a113280 文 ...

  7. python程序按钮怎么创建_如何使用pygame创建按钮?

    pygame(以及底层库SDL)是一个用于以跨平台方式构建图形应用程序的库.这意味着它可以帮助你创建一个窗口,将灵长类的形状/颜色/纹理绘制到屏幕上,使用声音.计时器等.虽然它提供了使用自己的API进 ...

  8. 移动端web设计尺寸_手机移动端网页按钮设计尺寸及间距规范

    网页版面上的字体大小有讲究,而网站的按钮的尺寸及按钮之间的间距标准非常有细节规范. 序幕 - 点击,再点击,重复点击!用户是否能够以高触摸精度点击您的移动按钮,又或者他们是错过了按钮的目标?在责怪用户 ...

  9. Java 按钮组件_提交按钮

    按钮在Swing中是非常常见的组件,用于触发特定动作.Swing中提供多种按钮,包括提交按钮.复选框.单选按钮等,这些按钮都是从AbstractButton类中继承而来的. 提交按钮 Swing中的提 ...

最新文章

  1. 鄂维南院士:科学与智能——机器学习的新前沿、应用数学时代的曙光
  2. 混合模式单点登录的实现
  3. java根据经纬度坐标计算两点的距离算法
  4. gsea富集分析结果怎么看_怎么看肝功能检验结果?
  5. 数学之美 系列十一 - Google 阿卡 47 的制造者阿米特.辛格博士
  6. 阿里面试官:什么样的人能在阿里晋升?
  7. 使用AWS使Spring Boot应用程序无服务器运行
  8. java开启新线程的三种方法
  9. python包的管理(添加的3种方式 删除包)
  10. 蚂蚁集团上市 员工身价暴涨人均一套房?支付宝:没有 但会努力的
  11. 实现删除商品信息功能
  12. sourcetree使用简介
  13. 电脑键盘上每个键的作用_键盘F键有什么作用 键盘F键作用介绍【详解】
  14. shell脚本监控cpu/内存使用率 转
  15. 976. 三角形的最大周长
  16. The Penn Discourse TreeBank 2.0
  17. SparkSql引起的一场灾难
  18. windows命令行快速启动软件
  19. 2021-04-06梦笔记
  20. 高帝制礼作乐,周昌谏废太子

热门文章

  1. ObservableScrollView实现
  2. 对象流java_Java中的对象流总结(必看篇)
  3. 1.1.29 加入项目符号后换行文字未对齐
  4. db2 设置表 not null
  5. javascript 函数初探 (六)--- 闭包初探#4
  6. hdoj_1421搬寝室
  7. C# 正则表达式选项总结
  8. python的字符串删除操作 有点简单
  9. centos 8+VMware下载安装教程(1)
  10. Python自动检测视频画面的旋转角度