Android Lottie 中秋月餅變明月動畫特效

    小菜在 Android 端進行動畫處理時主要用的是 Android 自帶的三種動畫形式,今天小菜簡單嘗試通過 Airbnb Lottie 展示一箇中秋月餅變明月的小動畫;

Lottie

    Lottie 動畫是 Airbnb 開源的一套多平臺兼容的動畫形式,小菜之前簡單嘗試過 Flutter 版本,使用非常便捷,今天小菜簡單瞭解一下 Android 版本;

案例嘗試

1. 集成依賴

    在 build.gradle 中集成最新版本的 Lottie 依賴並同步;

api 'com.airbnb.android:lottie:4.1.0'

2. 添加 LottieAnimationView 加載網絡資源

    首先在 xml 文件中添加 LottieAnimationView,之後通過 setAnimationFromUrl() 加載網絡資源;其中加載網絡圖片時有兩個重載方法,其中 cacheKey 爲緩存策略;加載完網絡資源之後還需要 playAnimation( 啓動動畫;

<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. 加載本地資源

    當 LottieAnimationView 加載本地資源時,需要先下載生成的 json 文件,並添加到工程中,通過 setAnimation() 引入本地資源;其中 setAnimation() 也有多個重載方法,可以靈活應用;

mView2 = (LottieAnimationView) this.findViewById(R.id.lottie_view2);
mView2.setAnimation("mooncake.json");
mView2.playAnimation();

4. 循環播放 & 動畫監聽

    前兩步設置完 setAnimation() 之後,播放完成就停止動畫,若需要重複播放,可以通過 loop(true) 方式進行循環播放,但該方法在新的 API 中不建議使用,可以通過 setRepeatCount() 設置播放次數,或通過動畫監聽在動畫結束時再次播放等;

mView2.loop(true);

mView1.setRepeatCount(5);

    可以通過 addAnimatorListener() 進行動畫監聽;其中當設置 **** 播放次數後,每次播放均會調用 onAnimationRepeat() 回調,播放結束之後纔會調用 onAnimationEnd();而如果不設置播放次數時,不會進入 onAnimationRepeat() 回調;

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. 暫停 & 繼續 & 取消

    小菜通過 playAnimation() 使動畫進行播放;而 Lottie 也提供了 pauseAnimation() 暫停動畫;resumeAnimation() 暫停後繼續播放以及 cancelAnimation() 取消動畫等方法;

    其中調用 playAnimation() 時會從動畫起始位置播放,而 resumeAnimation() 會從暫停或取消動畫停止位置播放;pauseAnimation()cancelAnimation() 均會停止動畫,但 cancelAnimation() 停止後會 lottieDrawable.cancelAnimation() 清空動畫 Drawable,且會在 onAnimationCancel() 監聽中進行回調;

@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;
    }
}

小擴展

1. 硬件加速器

    小菜在使用 Lottie 時建議開啓硬件加速器,降低動畫幀率,避免卡頓;

android:hardwareAccelerated="true"

2. json 文件解析

    小菜之前覺得 Lottiejson 文件是一個很神奇很複雜的天書,今天小菜簡單介紹一下其中屬性對應關係;


    整體結構包括如下幾個部分:v 爲對應 bodymovin 動畫版本;fr 爲幀率;ip / op 分別對應起始/結束關鍵幀;w / h 爲動畫寬高;assets 爲資源信息,包括 Drawable 等;layers 爲圖層信息;

    asstesw / h 爲資源寬高;u / p 分別對應資源路徑和名稱;其中的 layers 也爲圖層信息;layers 中的 ks 爲動畫的主要信息;

    小菜理解 Lottie 整體是利用屬性動畫控制進度,通過進度變更更改 layers 中觸發 LottieAnimationView 重繪各個資源信息;


    小菜的中秋月餅變明月的 Lottie 動畫嘗試到此爲止,主要是熟悉了一下 Android Lottie 的應用;如有錯誤,請多多指導!

來源: 阿策小和尚

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章