立即下载 知乎日报 每日提供高质量新闻资讯

- 领导想喝水了 - iOS:好的 - Android:水在哪儿啊?

图片:Yestone 邑石网正版图库

问题描述:为什么 iOS 的过渡动画看起来很舒服,大部分安卓手机的过渡动画却很生硬?可以从设计或者美术的角度来分析一下吗?

为什么 iOS 的过渡动画看起来很舒服?

MartinRGB,I write shitty code

我在国内三家安卓大厂动画设计岗位混了三年饭吃,日常主要是使用 After Effect 设计快速演示视频,使用 Android Studio 还原高保真细节,偶尔遇到瓶颈时会编写、查阅一些 iOS 动画效果来寻找平台差异的问题。

感恩的话我先说,吃水不忘挖井人,但我这波还是要吹 iOS。

可以从动画设计或者美术的角度来分析一下吗?

不能,这不完全是设计师的锅,这是 平台局限性、生态环境、国内环境 综合决定的。

我认识的大部分设计师在 设计 iOS 和 Android 的时候想的更多的是「设计产品,在多平台上实现」,并没有故意要在 Android 端不好好搞的意思。

我对 GUI 动画设计的一点微小看法:

GUI 动画设计不等于 AE 设计,GUI 动画设计等于你的设计通过程序实现在对应设备上的体验。

设计效果绝不是 AE 里面的动画曲线所能决定的,即便最简单的四大属性动画的预渲染效果,也在实现过程中有细微的差异,AE 的效果那是 Adobe 图形程序员的水平,而 GUI 中的效果要看平台差异。

Android 动画不如 iOS 动画的深层原因

在 GUI 中,动画的流畅取决于 运动学公式(我觉得达不到算法的级别)渲染性能。交互体验取决于框架中 对于动画的控制能力。这三个方面,我揣测一下,Google Android 工程师的态度是 漫不经心、做不到、可能觉得没必要。

iOS vs 安卓,一言以蔽之:

一套「成体系的 简单渲染开销小 高级动画开发相对容易」的「物理系统」 vs 「简陋的 开销大 高级动画开发困难」的「动画功能」

从编写相应的开发语言就可以发现。至少从两个系统动画部分的接口上来看,苹果对于动画的理解是「可实时交互,易于控制」,安卓这块,我的的理解是「一次播放,完成就好,优化效果什么的,自己调」。

运动公式

  • 触控设备交互的基础 — 动态滚动:无论是 iOS 还是 Android,滚动器的动画是基础,是核心,日常交互使用频率最高,也最容易被安卓厂商忽视优化的就是滚动(华为在这一环节做了不错的优化),使用滚动器的控件有哪些呢?iOS 的 TableView、ScrollView、CollectionView,Android 的 ScrollView、ViewPager、ListView、RecyclerView、GridView,我想不管是安卓应用开发还是 iOS 应用开发,免不了使用上述控件。而滚动这个部分,iOS 使用计算结果平滑的 DHO 的弹性动画体系,用来作交互中动画的反馈,曲线十分平滑。我写了两个 Demo,来调研这一环节。

  • 自定义贝塞尔:iOS 很早就提供了自定义贝塞尔插值 — Core Animation (iOS 2.0,2008),而我周围的安卓开发者不查查文档很少有人知道 PathInterpolator(API 21,2014),为什么一个自定义贝塞尔插值器的功能还需要第三方提供?

  • 运动公式的质量:公式的优化,优化,优化。安卓支持库 25 27 的 Spring | Fling 动画甚至连 只能造小轮子的 Facebook 的水平都不如(Facebook 在多端中使用自己的开源引擎)

  • 物理模拟:至于 UIKit Dynamic 那几个重力场、磁场,Core Animation 内置的粒子系统,安卓目前甚至还没有对应的第三方实现。

  • 默认动画器:安卓官方提供的动画插值器连第三方都不如,iOS 如果懒,可以直接使用默认的,效果也还不错。
  • 只能规范自己人的动画指南:Google MD 那套风格,只有他们自己用的统一,其他安卓厂商的动画规范比较混乱。

渲染

没职业做过开发,这块的理解不一定对,我只能从我接触的几个点掰扯掰扯,有误请指正。

iOS 在图形方面给开发者提供了大量的 API 、框架、工具,以制造精妙绝伦的用户体验。

这不是 iOS 开发教材的章节导语,这是大实话。

  • 绘制成本:根据之前室友 Cyandev 的说法,Android 一个简单的属性动画的 drawcall 远高于 iOS。而高级 GL 动画,使用过几次 NDK + GLES 就感觉,搞同样的实时渲染效果,安卓比 iOS 麻烦。
  • 对 GPU 的利用:作为 UIKit 和 GLES/Core Graphics 的中间层,Core Animation 的 GPU 加速和低功耗,以及简易的上手,让即便很简单的基础动画、线条动画,以及稍微复杂的动画渲染都更加流畅、平滑。
  • 性能问题:很多很基本的动画 Demo,编写 iOS 应用时很少 skip frames,Android 稍微不注意,就会掉帧。

  • 图形新标准的实际支持情况:iOS 的工程师能搞出 Metal 这种开销控制精准的玩具,而安卓支持的 Vulkan 普及率远远不及,Android 上使用 Vulkan 来提升性能的应用有多少?
  • 系统级实时模糊:Android 应用层的实时模糊依赖采样,系统级模糊依赖于渲染前的合成,Android 虽然提供了 Renderscript,但是效果。。。iOS 的 Real-Time Blur 最近才有安卓厂商可以高效的做出来(MIUI 10,不知道跟之前 MIUI 6 的那个实时模糊的渊源),当然也得益于移动端 GPU 的性能提升和越来越高效的实时模糊算法。
  • AV 功力对比:Android 上有能像 iOS Live Photo 那样可以精准控制视频的原生框架么?之前一家公司请了位音视频专家才搞定。

  • 官方示范:iOS 7 的动态天气,安卓官方有提供相关的图形学官方案例应用吗?

控制

  • iOS 理解屏幕刷新对于交互的意义,给开发者提供了很多可以编写交互式动画、并且使用简单的接口:例如,iOS 的 CADisplyLink 是交互式动画的好帮手,很轻松的就可以根据屏幕刷新来「定义运动的方式,交互输入控制运动的走向」,而 Android 提供的更多是「定义运动的方式和走向,要想控制你要自己写」。用容易使用的插值器?改过几个交互式效果,很不理想。用 Choreographer ?太麻烦了,感觉像自己在造动画器。
  • 无法编程实现,就用帧动画:国内很多 ROM 里面的动画其实就是序列帧动画播放器。安卓开发者首先要保证序列帧体积小,编写序列帧循环池来降低内存负担,提高播放性能,而 FrameAnimation 这种动画本身的控制能力就差。(对比去年热点动画,人工智能语音助手,图形学 Siri vs 众多序列帧 Form/Particular/Tao 球)
  • 事件监听:就手势而言,iOS 的 GestureRecognizer 能比 Android GestureDetector 提供了更多的控制,也能获取到更多的对象信息,这为交互打下基础。写法上,iOS 也更舒服。iOS 大致步骤是:给对象添加具体的 GestureRecognizer(点击、拖拽 等),再定义这种手势具体状态下的行为(开始、变化、结束、取消)。而 Android,你需要根据手势的具体行为去判断是何种手势,是拖拽?还是长按?虽然更自由一些,但是很容易不精确定义手势。

工具 / 教育开发者

  • 官方的 Quartz Composer 让你在研究 Apple 图形功能的时候还可以 WYSIWYG 的开发滤镜(还可以做屏保,hhh)

  • Powered by Core Animation 的原型工具 Principle | Kite Composer | Core Animator
  • 除此之外,大量的 Mac 端开发者工具,从图标、设计,再到原型,让你舒舒服服的开发。
  • 每年的 WWDC 大量 设计结合开发的 Session 提高了 iOS Developer 的追求上限。

国内现状

  • 要快:一快遮百丑,大部分消费者认为 「开启速度快」就是最好的,媒体也一直在这样引导用户。
  • 安卓开发者的取向:ROM 开发者很少研究安卓动画部分知识,需要精力研究底层、优化、省电。没有从运动公式、屏幕刷新、渲染整套流程思考安卓动画问题,而且这也不能体现实力和绩效。而业内的安卓高手,好像不喜欢在 ROM 公司工作。
  • 设计师曲线万能论:GUI 动画问题的根源在于 GUI 平台的局限性,设计师很少了解绘制、动画、图形开发层面的具体实现,以为动画曲线、弹性的实现是问题所在,而这只是整个过程的第一步,是问题的冰山一角。
  • 脱离实际的产品设计流程:对安卓的理解仅限于本公司 rom 的控件,对原生安卓的了解十分有限。设计师在理想化的设计工具里纸上谈兵,却对实际环境中所可能遇到的问题了解有限,让提线木偶开发者上阵斗恶龙,一方面是设计的偏差,一方面会导致情绪化的沟通。
  • 市场因素:赶工,赶工,赶工,激烈的市场环境,动画方面每个项目都很难耐心去好好做,去吃透这一部分的来龙和去脉,所以事后经验梳理起来很难由浅入深。
  • 热点优先:热点吃香,较为基础的体验没人管,在基因不符,公司 DNA 不对的情况下追热点(AI、VR、AR、语音),和各种热点领域和各种巨头合作,而这些合作却没有培养出内部相关技术的种子,最后几乎都靠向高通、商汤、讯飞购买技术,有布局,无成果。内部人员吃不透高级技术,那么一旦遇到稍微复杂的动画开发基本就束手无策,或者采用设计上最不优雅的实现。
  • 对帧率的理解停留在早期影视行业:移动端 60 FPS 才是标准,30 FPS 真的肉眼可见的不流畅,在不少 ROM 厂商的 Frame Animation 是 30FPS 渲染出来的。

尽管安卓手机上出现了越来越多的新兴技术,但 iOS 7 的基础动画体验至今让我感到难以超越,现在的安卓厂商都已经忘了对日常细节的追求,他们只在意新的热点。

当你作为“制作者”,上手尝试在安卓上优化这些体验,却发现难以逾越,有平台的局限,也有国内整体设计开发人员能力的局限。

扫描二维码下载知乎日报

支持 iOS 和 Android
二维码下载知乎日报
阅读更多 赶重要会议,可以带客户坐地铁吗? 下载 「知乎日报」 客户端查看更多