Android Lottie實(shí)現(xiàn)中秋月餅變明月動(dòng)畫(huà)特效實(shí)例
前言
小菜在 Android 端進(jìn)行動(dòng)畫(huà)處理時(shí)主要用的是 Android 自帶的三種動(dòng)畫(huà)形式,今天小菜簡(jiǎn)單嘗試通過(guò) Airbnb Lottie 展示一個(gè)中秋月餅變明月的小動(dòng)畫(huà);
Lottie
Lottie 動(dòng)畫(huà)是 Airbnb 開(kāi)源的一套多平臺(tái)兼容的動(dòng)畫(huà)形式,小菜之前簡(jiǎn)單嘗試過(guò) Flutter 版本,使用非常便捷,今天小菜簡(jiǎn)單了解一下 Android 版本;

案例嘗試
1. 集成依賴
在 build.gradle 中集成最新版本的 Lottie 依賴并同步;
api 'com.airbnb.android:lottie:4.1.0'
2. 添加 LottieAnimationView 加載網(wǎng)絡(luò)資源
首先在 xml 文件中添加 LottieAnimationView,之后通過(guò) setAnimationFromUrl() 加載網(wǎng)絡(luò)資源;其中加載網(wǎng)絡(luò)圖片時(shí)有兩個(gè)重載方法,其中 cacheKey 為緩存策略;加載完網(wǎng)絡(luò)資源之后還需要 playAnimation( 啟動(dòng)動(dòng)畫(huà);
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottie_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
mView = (LottieAnimationView) this.findViewById(R.id.lottie_view);
mView.setAnimationFromUrl("https://assets6.lottiefiles.com/packages/lf20_Tprkoc.json");
mView.playAnimation();

3. 加載本地資源
當(dāng) LottieAnimationView 加載本地資源時(shí),需要先下載生成的 json 文件,并添加到工程中,通過(guò) setAnimation() 引入本地資源;其中 setAnimation() 也有多個(gè)重載方法,可以靈活應(yīng)用;
mView2 = (LottieAnimationView) this.findViewById(R.id.lottie_view2);
mView2.setAnimation("mooncake.json");
mView2.playAnimation();

4. 循環(huán)播放 & 動(dòng)畫(huà)監(jiān)聽(tīng)
前兩步設(shè)置完 setAnimation() 之后,播放完成就停止動(dòng)畫(huà),若需要重復(fù)播放,可以通過(guò) loop(true) 方式進(jìn)行循環(huán)播放,但該方法在新的 API 中不建議使用,可以通過(guò) setRepeatCount() 設(shè)置播放次數(shù),或通過(guò)動(dòng)畫(huà)監(jiān)聽(tīng)在動(dòng)畫(huà)結(jié)束時(shí)再次播放等;
mView2.loop(true); mView1.setRepeatCount(5);
可以通過(guò) addAnimatorListener() 進(jìn)行動(dòng)畫(huà)監(jiān)聽(tīng);其中當(dāng)設(shè)置 **** 播放次數(shù)后,每次播放均會(huì)調(diào)用 onAnimationRepeat() 回調(diào),播放結(jié)束之后才會(huì)調(diào)用 onAnimationEnd();而如果不設(shè)置播放次數(shù)時(shí),不會(huì)進(jìn)入 onAnimationRepeat() 回調(diào);
mView2.addAnimatorListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
Log.e(TAG, "-> onAnimationStart()");
}
@Override
public void onAnimationEnd(Animator animator) {
Log.e(TAG, "-> onAnimationEnd()");
}
@Override
public void onAnimationCancel(Animator animator) {
Log.e(TAG, "-> onAnimationCancel()");
}
@Override
public void onAnimationRepeat(Animator animator) {
Log.e(TAG, "-> onAnimationRepeat()");
}
});

5. 暫停 & 繼續(xù) & 取消
小菜通過(guò) playAnimation() 使動(dòng)畫(huà)進(jìn)行播放;而 Lottie 也提供了 pauseAnimation() 暫停動(dòng)畫(huà);resumeAnimation() 暫停后繼續(xù)播放以及 cancelAnimation() 取消動(dòng)畫(huà)等方法;
其中調(diào)用 playAnimation() 時(shí)會(huì)從動(dòng)畫(huà)起始位置播放,而 resumeAnimation() 會(huì)從暫?;蛉∠麆?dòng)畫(huà)停止位置播放;pauseAnimation() 和 cancelAnimation() 均會(huì)停止動(dòng)畫(huà),但 cancelAnimation() 停止后會(huì) lottieDrawable.cancelAnimation() 清空動(dòng)畫(huà) Drawable,且會(huì)在 onAnimationCancel() 監(jiān)聽(tīng)中進(jìn)行回調(diào);
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.main_btn1:
mView2.playAnimation();
break;
case R.id.main_btn2:
mView2.pauseAnimation();
break;
case R.id.main_btn3:
mView2.resumeAnimation();
break;
case R.id.main_btn4:
mView2.cancelAnimation();
break;
}
}

小擴(kuò)展
1. 硬件加速器
小菜在使用 Lottie 時(shí)建議開(kāi)啟硬件加速器,降低動(dòng)畫(huà)幀率,避免卡頓;
android:hardwareAccelerated="true"
2. json 文件解析
小菜之前覺(jué)得 Lottie 的 json 文件是一個(gè)很神奇很復(fù)雜的天書(shū),今天小菜簡(jiǎn)單介紹一下其中屬性對(duì)應(yīng)關(guān)系;

整體結(jié)構(gòu)包括如下幾個(gè)部分:v 為對(duì)應(yīng) bodymovin 動(dòng)畫(huà)版本;fr 為幀率;ip / op 分別對(duì)應(yīng)起始/結(jié)束關(guān)鍵幀;w / h 為動(dòng)畫(huà)寬高;assets 為資源信息,包括 Drawable 等;layers 為圖層信息;

asstes 中 w / h 為資源寬高;u / p 非別對(duì)應(yīng)資源露肩和名稱;其中的 layers 也為圖層信息;layers 中的 ks 為動(dòng)畫(huà)的主要信息;
小菜理解 Lottie 整體是利用屬性動(dòng)畫(huà)控制進(jìn)度,通過(guò)進(jìn)度變更更改 layers 中觸發(fā) LottieAnimationView 重繪各個(gè)資源信息;
總結(jié)
到此這篇關(guān)于Android Lottie實(shí)現(xiàn)中秋月餅變明月動(dòng)畫(huà)特效的文章就介紹到這了,更多相關(guān)Android Lottie動(dòng)畫(huà)特效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 仿余額寶數(shù)字跳動(dòng)動(dòng)畫(huà)效果完整代碼
這篇文章主要介紹了Android 仿余額寶數(shù)字跳動(dòng)動(dòng)畫(huà)效果完整代碼,需要的朋友可以參考下2017-11-11
android 中 webview 怎么用 localStorage
這篇文章主要介紹了android 中 webview 怎么用 localStorage方法的相關(guān)資料,需要的朋友可以參考下2015-07-07
flutter Toast實(shí)現(xiàn)消息提示框
這篇文章主要為大家詳細(xì)介紹了flutter Toast實(shí)現(xiàn)消息提示框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
快速解決fragment中onActivityResult不調(diào)用的問(wèn)題
下面小編就為大家?guī)?lái)一篇快速解決fragment中onActivityResult不調(diào)用的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Android百度地圖定位后獲取周邊位置的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android百度地圖定位后獲取周邊位置的實(shí)現(xiàn)代碼,準(zhǔn)確獲取周邊地理位置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
Android日期選擇器對(duì)話框DatePickerDialog使用詳解
這篇文章主要為大家詳細(xì)介紹了Android日期選擇器對(duì)話框DatePickerDialog的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Android 實(shí)現(xiàn)永久性開(kāi)啟adb 的root權(quán)限
這篇文章主要介紹了Android 實(shí)現(xiàn)永久性開(kāi)啟adb 的root權(quán)限,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

