Android 做到 iOS 如丝般柔滑的过渡动画真的很难吗?
我是做安卓的,我个人认为有些困难,IOS的流畅只是一个感觉,实际的表现主要是帧率稳定和非线性动画,而且还牵扯到IOS的底层实现,包括OC天然的高效率等等因素,至于什么墓碑机制啊,统一推送啊,我觉得都不是主要原因,可能在之前是主要原因,但是随著安卓设备硬体的不断提升,这些真的不是最重要的因素了,就算安卓是真后台,来个7,8个应用后台运行,对现在的安卓机都不叫事,不存在系统吃紧的原因,我个人认为主要因素主要有3点
1. IOS的响应优先顺序不一样,我记得IOS会优先处理touch事件,然后就是动画之类的媒体事件,包括图形处理,而安卓对于touch或者说图形图像处理的层级相对靠后,我觉得这是一个原因(这里我说一下,首先,我也不是搞底层优化的,只是之前看过一篇文章,他的意思好像是说媒体或者图形处理会优先响应触摸事件,确实之前的说法不太妥当,touch事件肯定是要第一时间响应的,只不过是有延迟的差异,因为目前安卓版本更新很频繁,如果有一些知识我没有及时更新,还请谅解)
2. 再一个就是苹果很聪明的用了很多非线性动画,包括很多精美的动画默认就是封装好的,是控制项自带的效果,比如ListView(安卓的类名)弹性滚动等等,这些动画在很大程度上会给你很流畅顺滑的感觉,而安卓大部分控制项只是实现功能,如果你想在交互层面锦上添花就要自己去实现你想要的效果自定义控制项,这就参差不齐了,很多安卓现在比较常用的交互逻辑,完全都是借鉴IOS的原生控制项效果,有的时候真的不得不佩服苹果,很多细节考虑的很周全,因为人家原生的控制项就足够精美高效,让开发者开发出来的应用在用户使用逻辑上达到高度的统一,不过在比较新的一众Material Design控制项中,比如Recyclerview等等,安卓也原生加入了些灵动的动画效果,但是总感觉小巫见大巫,IOS的启动速度一向不是优势,而安卓一直在这方面很强势,参考小白的测试数据,所以我觉得流畅顺滑和速度并不是成正比的,启动不快的IOS一样给人留下很顺滑的感受。
3. 我觉得就是OC的开发语言,java是虚拟机机制,需要转换位元组码,换成机器能读懂的指令,而且在之前都是边解释边运行,效率可想而知,不过在5.0后出了ART模式,本质就是想解决这个问题,可以在初次使用时全部解释完,但是我觉得效果不是很好,最近华为也出了方舟编译器,其实原理都一样的,OC我不太懂,但毕竟是C语言系的,在C的基础上加了面向对象的概念,更易用,虽然java天生就是面向对象的,但是C和java本就是完全两种语言和运行模式,OC的高效不言而喻,这肯定也是一个主要原因
剩下的就都是普罗大众都知道的一些东西,什么IOS封闭啊,APP质量高啊之类的,苹果的流畅确实是不容易,我作为一个安卓开发人员其实很喜欢苹果的设备,目前用P30,准备下一个手机换个苹果的,就说这么多吧,欢迎指正和探讨
-----------------手动分割线-----------------
感谢大家的点赞和评论,我再补充一些我认为比较大的影响因素,上面的回答说到启动速度,确实是安卓领先,但是我觉得以苹果的硬体和软体的实力,达到启动速度快的目的并不难,我甚至认为苹果是有意为之的,故意让启动中间加一些动画,还是那句话,流畅和顺滑真的不是一个快就完事了,是一系列的从无到有,从慢到快的渐变过程,我觉得安卓的动画太死性,因为一般用的属性动画,就是从A点到B点的一个位移,如果想达到IOS的弹性效果,就要加入差速器,但是我试过,流畅度还是比不了IOS,而且还有一点不可否认,就是苹果的设备少,相对应的软体就可以最大程度的去匹配硬体,这就跟为什么PS4的硬体水平往往都落后于同期的PC很多,但是玩游戏的流畅度和体验永远比PC强好多,因为PS4就这一款硬体,所有的软体开发商相对好做适配,而PC,幺蛾子太多,硬体玲琅满目,还能DIY,这就跟安卓和IOS的情况很像,IOS同年几乎只有一两款设备更新,而且硬体完全一致,核心都由苹果设计,比如CPU等等,而安卓那真是不要太多,光CPU就有很多厂商可以提供,而且手机厂商还要对系统做二次开发和适配,加入很多自己的业务内容,这在本质上就已经算是污染了操作系统,而这也是谷歌想做的,就是自己出个"架子",然后大家各取所需去改造去添加你想要的"肉",尤其是国内连谷歌服务都用不了,真的就只剩一个架子了,所以能单独做软体优化也是一个很重要的原因,这也是为什么说苹果的硬体和软体结合的最完美,因为都是单对单,永远刚好够用,达到利益和产品使用的平衡点,苹果的内存,苹果的电池,甚至苹果的充电器都落后安卓N个时代,但一样拥有比安卓更好的体验,这种以小博大的感觉,就像中国太极的四两拨千斤,没有哪个股东不喜欢这种企业,所以苹果的价格贵不是没有道理,因为只此一家,总之,苹果的系统体验真的不是一个开发人员就能左右的事情,这其实体现了完全两种不同的商业模式,两种理念,当然,目前随著高通一统天下,安卓的优化相对而言,少了很多选项,而且你也可以看到厂商都会对高通的晶元做优化,没办法,因为安卓就是SOC企业在牵著手机厂商在走,而IOS完全是苹果在牵著其他企业在走,你说能一样吗?????
镜像问题回答 — 为什么 iOS 的过渡动画看起来很舒服? ,其中有一些安卓顽疾已经在 Android Q 修复了。
我为解决问题做的努力 — 开源动画框架 Animer,在控制和速度状态上尝试解决一些问题
https://github.com/MartinRGB/Animer?github.com以下原回答:
- 复杂效果不得已使用 GL,载入兼容功耗 三座大山。
- 稍微复杂一点,就要开新线程,防止 UI 线程阻塞,CPU 功耗开发不愿意背锅
- 要自定义控制项,难推广,介面要考虑面面俱到,执行时很多人不用自定义控制项,自己写。
- 工程人员更熟悉和更情愿使用 安卓 的动画系统,功耗低,使用简单,但原生动画系统设计有缺陷,死板,手势交互能力弱。
- 一线开发人员工程和谷歌源码解读能力强,但很多很细腻的细节体验是数学问题,面对问题用数学理论解决能力弱。iOS 早期设计师很多深谙数学物理,设计动态交互界面有合理的理论依据,而不单从艺术角度出发,因此动画非常自然。
- 国产定制,设计风格延续没有落实到代码层面(Apple 的设计几乎原汁原味体现在它 API 里),换皮频繁,导致费尽力气写的细腻交互下个版本被砍。交互效果的经验很难沉淀-总结-编写自定义控制项-完善并延续。
- 工程人员被每次版本迭代的 布局 视觉效果 功能整得焦头烂额,没有时间安排去做整个 GUI 系统改良。
- 基于 Skia 设计的软体图形渲染能力差,图形介面难用,简单效果动辄性能问题,非常费心。有时候开硬体加速却跟安卓软渲效果冲突。(这点评论区有人质疑,有不少系统也使用了 Skia,这里我持保留意见)
- 修改了安卓 Time Function 动画器,动画核心公式改为按 frame 解算,并给做俩介面给外面以方便动画过程中控制,测试那边又功耗警告。
- 国内起步晚,从业人员的经验往往是基于现有流行GUI 框架进行再开发和再设计以及之后的优化,很少有人有完整创作一套复杂 GUI 框架的经验,有的话也很少注意 动画 这种前端和体验层面,这块可以说是盲区。你觉得国内有多少开发者能很清晰的理解一个动画器完整的原理,一套滚动引擎所需要的物理理论,速度在手势交互界面中的意义?
- 而美国从业者一直在频繁创造复杂 GUI 框架,培养了大量的从业人员,知道如何用积累的数学物理知识快速造一套手势交互界面。(WinPhone Cocoa Framer Android Flutter)
- iOS 的动画系统的理念是交互导致的视觉反馈,它非常注重动画的先决条件是交互,不同的交互条件,不同的动画反馈。
- Android 动画系统的理念是交互导致视觉效果的播放,动画是交互后行为,而不是交互的实时反馈。(Dynamic Animation 就是这种思路,定义对象及运动属性,定义开始和结束,)殊不知一个被交互元素应该是鲜活的,是可以根据不同的交互行为产生不同的反馈结果的。
- 依然有些测试人员教条主义,「我们的动画一定要跟友商一样的动画时间」,然而动画是有视觉欺骗的,先快后慢的长时间动画,先慢后快的短时间动画,用户对运动的感知时间可能是一样的。
- 很少有设计师设计动画考虑动量的,手势系统无缝衔接动画系统,动量非常重要,涉及的知识点也很复杂 手势知识 动画系统知识,上面的数学物理知识,以及设计美感。
- 国内审美 是 GUI 动画设计 = 找一帮子做影视剪辑的往里塞特效 + AE 里纸上谈兵做点理想 video,Framework 本身动画系统情况设计师不关心,开发也不关心,只觉得烦。
- 所有的 安卓公司除了谷歌都是伪互联网型公司,汇集了大量传统设计 老套开发,你指望他们脱离同行互抄业务,舍弃丰厚收入带来的安逸感,耐下心踏踏实实学基础理论,底层用坚实的数学理论改革,上层创新?这帮人 玩不转的
设计开发人员素质 框架本身缺陷 国内用户审美,整个链条的问题。
而且就连从业者,听到动画就说要丝滑流畅,那到底什么叫丝滑呢?什么叫流畅呢?一直用这种很虚的词在描述,能进步就怪了。应该用「无延迟,符合自然规律,交互反馈真实」这种术语。
职业学校毕业的木匠用不怎么好的工具,还被要求每天做一件木工艺品给对木工不怎么了解的消费者,流水线能做好就怪了。
隔壁木匠一个月做一个,工具又快又新,而且消费者是行家,听说这木匠专门学了好久木工专业。
不是不能做,但的确有些困难,主要是几个原因:
1、安卓APP项目的工程量一般要比同一个iOS项目大很多,因为安卓本质上是一个半成品,安卓开发在做项目的时候还要解决很多本应该Google解决的问题,另外安卓系统是一个超高设备兼容性系统,iOS虽然也有一定设备兼容能力,但和安卓比兼容需求小很多,所以安卓的GUI框架受到了高设备兼容性的制约,开发起来很不方便。
所以,安卓开发在做项目的时候,得把大量精力放在其他东西上面,也就没有足够时间去优化交互动画等效果,除非公司大到有一个专门的UED组。
2、安卓APP的UI结构一般是树状结构布局,而iOS一般是层叠结构布局,当然安卓也可以做层叠、iOS也能做树状,但由于开发习惯问题,一般最后都会做成这样。树状结构有个问题就是有时会很难实现一些跨结构的视图动画效果,而层叠相对好做很多。
所以往往会出现,一个APP的布局写好了,然后来了个交互效果,开发一看,我艸,没法搞,搞不好要重新布局,md不干了,做不了。
3、安卓渲染的性能问题,这个其实现在差距已经不是非常大了,但在低版本和一些极端情况(大厂的一些超复杂布局,比如我这某APP的首页)下差距依然比较明显,理论上是可以优化的,但谁去做,谁有时间做,有没有必要做,是个问题。很多APP的首要任务并不是让交互丝滑,而是尽可能快得完成功能,抢占市场,至于用户用APP的时候有一点点卡不是个问题。
4、另外很多安卓APP会关闭硬体加速,因为安卓打开硬体加速会造成一些问题,比如渲染各种不正常,耗电高等等问题,但关闭后,安卓APP渲染性能会下降相当多,我个人是不建议关闭的。
虽然这样说会被很多人骂,但是还是先说结论:Android使用的渲染引擎Surface烂!你看谷歌自己都不用这么烂的渲染引擎,Flutter用chrome引擎日常渲染自己的动画多流畅,能在iPhone 4s上跑60帧哦,能在Galaxy S3上跑六十帧哦。言下之意是什么???
开个玩笑,虽然是玩笑,但是结论还是不变。原因并不是谷歌不努力或者Android组水平低而是Linux那个宏内核设计(其实Linux压根就没有一个「有著给正常人类使用的用户界面」的发型版吧)。谷歌重启炉灶搞Fushia有很大一部分原因就是Linux的掣肘越来越严重。看一张Android渲染架构: