最近閑來無事,看到別的App有不少炫酷的動畫,特地逆向研究了一番,大致看到兩類,一種是lottie開發(fā)的,一種是SVGA實現(xiàn)的。
大致效果如下:



這兩種動畫實現(xiàn)極大的簡化開發(fā)人員的工作量,但是需要有一個好的設計師,至少會入門AE AI AN 。
在使用場景方面lottie主要是一些加載動畫,引導頁動畫底部icon切換動畫等一些輕量級動畫,而svga主要是一些主播中的打賞動畫,就像官方放出的送一個飛機火箭等執(zhí)行的一些動畫。
功能性方面?zhèn)€人比較推薦lottie,一方面是他的設計種類多,他的lottie動畫網(wǎng)站有大量的開放性設計提供使用,就算沒有設計師,開發(fā)者也可以下載一些上面提供的素材做一部分炫酷的動畫,另一方面是他官方app可以對做出來的動畫進行調(diào)試,能對播放速度,動畫大小,背景色及播放長度進行自定義,可擴展性更高一級。
1、lottie的動畫使用:
implementation 'com.airbnb.android:lottie:3.0.6'
新版lottie已經(jīng)適配了androidx,如果不想適配androidx的同學可以使用早一些的版本。
布局文件使用:
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottieAnimationView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appCompatImageView"
app:lottie_fileName="data.json"
app:lottie_loop="true"
app:lottie_autoPlay="true"
app:lottie_colorFilter="@color/colorAccent"
app:lottie_renderMode="automatic"
/>
| 屬性 | 作用 |
|---|---|
| app:lottie_fileName | 參數(shù)為動畫資源,放在assets目錄下,格式為json文件,導出json的AE格式后續(xù)會提到 |
| app:lottie_loop | 是否循環(huán)播放 |
| app:lottie_autoPlay | 是否自動播放 |
| app:lottie_colorFilter | 設置顏色 |
| app:lottie_renderMode | 渲染模式 |
| app:lottie_speed | 設置播放速度 |
| app:lottie_url | 設置url |
渲染模式 主要分為以下三種
AUTOMATIC自動模式
HARDWARE硬件加速模式
SOFTWARE軟件加速加速模式
也可以使用lottieAnimationView.setMinFrame與lottieAnimationView.setMaxFrame來設置動畫執(zhí)行的最小與最大幀,這樣可以實現(xiàn)引導頁的動畫執(zhí)行順序與暫停等。
如果動畫所在頁面滑動不流暢,可以設置這三種模式中的一種來調(diào)試動畫。我使用的SOFTWARE模式在絕大部分機型上都沒有卡頓現(xiàn)象,但使用HARDWARE模式,有一些復雜動畫在執(zhí)行的時候會出現(xiàn)滑動列表不流暢等性能問題。調(diào)試動畫的幀率可以使用官方app查看。
代碼中可以設置動畫監(jiān)聽,在不同的動畫狀態(tài)搞事:
lottieAnimationView.addAnimatorListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
如果想使用常駐動畫,可以設置緩存強引用 animationView.setAnimation("data.json", LottieAnimationView.CacheStrategy.Strong);
其中CacheStrategy的值可以是Strong,Weak或者None,它們用來決定LottieAnimationView對已經(jīng)加載并轉(zhuǎn)換好的動畫持有怎樣形式的引用(強引用/弱引用)。
有的同學也會看到別的app為何有json文件和圖片文件2種呢?json中還使用到了那種圖片,單獨設置lottie_fileName肯定是不行的,運行會出問題,結(jié)構(gòu)目錄如下:


你需要添加app:lottie_imageAssetsFolder="images/"來給lottie設置文件夾,這樣動畫就會找到資源圖片。
2、SVGA的動畫使用:
工程gradle中添加
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
app的gradle中添加
compile 'com.github.yyued:SVGAPlayer-Android:2.4.4'
SVGAPlayer也可以從本地 assets 目錄,或者遠端服務器上加載動畫文件。
<com.opensource.svgaplayer.SVGAImageView
android:layout_height="match_parent"
android:layout_width="match_parent"
app:source="posche.svga"
app:autoPlay="true"
android:background="#000" />
| 屬性 | 作用 |
|---|---|
| source: String | 用于表示 svga 文件的路徑,提供一個在 assets 目錄下的文件名,或者提供一個 http url 地址 |
| autoPlay: Boolean | 默認為 true,當動畫加載完成后,自動播放 |
| loopCount: Int | 默認為 0,設置動畫的循環(huán)次數(shù),0 表示無限循環(huán) |
| clearsAfterStop: Boolean | 默認為 true,當動畫播放完成后,是否清空畫布 |
| fillMode: String | 默認為 Forward,可以是 Forward、 Backward。Forward 表示動畫結(jié)束后,將停留在最后一幀Backward 表示動畫結(jié)束后,將停留在第一幀。 |
緩存
SVGAParser 不會管理緩存,你需要自行實現(xiàn)緩存器。
設置 HttpResponseCache
SVGAParser 依賴 URLConnection, URLConnection 使用 HttpResponseCache 處理緩存。
添加代碼至 Application.java:onCreate 以設置緩存。
val cacheDir = File(context.applicationContext.cacheDir, "http")
HttpResponseCache.install(cacheDir, 1024 * 1024 * 128)
想了解詳細的Api可查看官方的提供的https://github.com/yyued/SVGAPlayer-Android/wiki/APIs
最后附上我做的一個動畫gif,自然里面的資源都是來自網(wǎng)上或其他app的僅供學習研究:

以上開發(fā)人員可以實現(xiàn)自己的炫酷動畫了,自然如果需要一些引導頁的炫酷動畫,只能求設計師做了,畢竟程序員本職工作還是寫代碼。
