01了解 Android 動畫
在Android 中,動畫一般分為三類,幀動畫(Frame Animation)、補間動畫(Tween Animation)、屬性動畫(Property Animation)。
幀動畫(Frame Animation)是將一張張相似的圖片組合在一起,然後一幀一幀的播放,利用人眼視覺殘留原理,讓我們感覺這就是動畫,跟 GIF 圖片、視頻播放的原理差不多。
幀動畫一般通過編寫 xml 實現,通過 AnimationDrawable 控制動畫啟動,停止。
如圖,以Android 項目中常用的網絡加載動畫為例,在 xml 資源文件中配置完成後,使用 AnimationDrawable 加載動畫。
補間動畫(Tween Animation),補間動畫是在兩個關鍵幀(可以理解為開始和結束幀)之間通過系統運算、設置等操作做「補間動畫」,使靜態圖像運動起來。補間動畫也可細分為透明動畫(AlphaAnimation)、旋轉動畫(RotateAnimation)、縮放動畫(ScaleAnimation)、位移動畫(TranslateAnimation)。
補間動畫以透明動畫為例
在 res 資源文件下新建一個 anim 目錄,新建 anim_alpha.xml
屬性動畫(Property Animation)是在 Android 3.0 以後才引入的,它可以直接更改對象的屬性。通過不斷地設置一個 View 的視覺屬性讓其出現動畫效果。 例如不斷設置 View 的 scaleX 屬性,就能實現 View 在 X 軸縮放的效果。屬性動畫有很多種實現方式,簡單的動畫使用 ObjectAnimator 就可以滿足,複雜一些的使用 ValueAnimator 結合 AnimatorSet 或 PropertyValuesHolder 使用就可以做出比較漂亮的動畫。
屬性動畫以簡單的 ObjectAnimator 為例,將 View 對象從 1.0的透明度改變到透明度為 0.3,再從 0.3 的透明度改變為 1.0 的透明度。
02Android 複雜、漂亮動畫的實現
Android 應用中,動畫是非常重要的,以個漂亮的動畫往往會給人耳目一新,喜歡上這個應用。要使用比較複雜、漂亮的動畫,使用 Android API 就比較難以實現了,或者說需要花更多的時間,往往還達不到理想中的視覺效果。比如,如下動畫的實現
該動畫效果來自 lottie 官方。這個動畫如果使用幀動畫來實現,很可能就會出現 oom。
這個動畫複雜在哪?
幀數多,如果把動畫分割成很多幀的話,不僅應用體積會增大,在加載時還很有可能會出現 oom。
這裡我用 ScreenToGIF 工具查看一下到底有多少幀
可以看出,這個動畫只有 418 幀……
那麼,用什麼框架或庫能完美實現這個動畫呢?答案是 lottie-android。
lottie-android 是 Airbnb 公司開源的框架,最低支持 Android API 16,從 lottie-android 2.8.0開始,遷移到了 androidx 項目,目前最新的版本是 lottie-android 3.4.1。Airbnb 也開源了 lottie-ios 、lottie-web等項目,也就是說,在公司項目 Android 和 IOS 等平臺都可以使用 lottie 加載漂亮的動畫。
lottie 怎麼使用?
以 Android 為例,當設計師通過 AE 製作好一個動畫之後,導出 Json 動畫數據文件,具體操作步驟可以參考 lottiefiles.com 提供的教程。在這上面也有很多漂亮的動畫供大家測試所用。
lottie-android 可以通過多種形式加載動畫,如 Assets 、JsonObject、Json 字符串、Url等。
加載 Assets 目錄下的動畫
Json 字符串加載
加載時可以設置緩存,動畫文件一般都比較大,資源消耗較高,設置緩存對加載速度和應用性能是很有必要的。
JsonObject 方式加載
JsonReader 方式加載
通過網絡 Url 加載
以上是使用 lottie-android 加載動畫的幾種方式,實際上 lottie-android 也還有其它加載方式,在實際應用中,你可以根據自己項目需要,閱讀 lottie-android 源碼,了解更多加載動畫方式。
下面介紹下 lottie-android 常用的一些用法
1、監聽動畫進度
監聽動畫進度應該算是比較常用的功能,比如,在 Splash 界面使用動畫,監聽動畫完成之後跳轉到下一個頁面。
2、播放、暫停、取消
播放 lottieAnimationView.playAnimation()
取消 lottieAnimationView.cancelAnimation()
暫停 lottieAnimationView.pauseAnimation()
3、循環
lottieAnimationView.setRepeatCount()
LottieAnimationView 默認是循環模式,可以通過設置 RepeatCount 控制循環次數,lottieAnimationView.setRepeatCount(0) 表示不循環。
關於 lottie-android 的使用就講到這裡了,如果您有更好的使用心得或有不明白的地方之處,歡迎在評論區裡留言,讓我們一起來討論 Android 動畫。
最後,附上在手機上實現的效果圖