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渲染架構: