国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 動(dòng)畫(huà) Lottie 如何使用

這篇具有很好參考價(jià)值的文章主要介紹了Android 動(dòng)畫(huà) Lottie 如何使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Android 動(dòng)畫(huà) Lottie 如何使用

一、簡(jiǎn)介

Lottie 是Airbnb開(kāi)源的一個(gè)面向 iOS、Android、React Native 的動(dòng)畫(huà)庫(kù),能分析 Adobe After Effects 導(dǎo)出的動(dòng)畫(huà),并且能讓原生 App 像使用靜態(tài)素材一樣使用這些動(dòng)畫(huà),完美實(shí)現(xiàn)動(dòng)畫(huà)效果。

二、Lottie動(dòng)畫(huà)文件制作

1.讓設(shè)計(jì)師使用Adobe 的 After Effects(簡(jiǎn)稱 AE)工具(美工一般都會(huì)這個(gè))制作這個(gè)動(dòng)畫(huà)。

2.在AE中安裝一個(gè)叫做Bodymovin的插件。下載?bodymovin,解壓縮后只需要\build\extension\bodymovin.zxp這個(gè)檔案就可以

lottie動(dòng)畫(huà),android

3.手動(dòng)安裝plugin,以windows系統(tǒng)而言,要先下載 **ExMan Command Line tool?**并解壓縮。 再來(lái)把下載的bodymovin壓縮后的 bodymovin-master\build\extension 目錄下的bodymovin.zxp 這個(gè)檔案復(fù)制進(jìn)去同一個(gè)資料夾。

lottie動(dòng)畫(huà),android

4.去找cmd,并以系統(tǒng)管理員身分執(zhí)行。

5.打“cd C:/ExManCmd_win?所在的路徑“,進(jìn)入ExManCmd的資料夾中

6.接著打 ExManCmd.exe /install bodymovin.zxp 就完

lottie動(dòng)畫(huà),android

7.再來(lái)進(jìn)入AE 后,可以在windows/extentions/bodymovin 找到插件,開(kāi)啟后按下Render 就完成了。?重點(diǎn)來(lái)了,這時(shí)會(huì)在你選的Destination Folder目錄中生成一個(gè)json格式的文件,這個(gè) json 文件描述了該動(dòng)畫(huà)的一些關(guān)鍵點(diǎn)的坐標(biāo)以及運(yùn)動(dòng)軌跡。

lottie動(dòng)畫(huà),android

三、如何使用Lottie

Lottie支持多平臺(tái),使用同一個(gè)JSON動(dòng)畫(huà)文件,可在不同平臺(tái)實(shí)現(xiàn)相同的效果。支持Android,ios,前段。

1.依賴

在項(xiàng)目的 build.gradle 文件添加依賴

dependencies {  
  compile 'com.airbnb.android:lottie:2.1.0'
}

2.動(dòng)畫(huà)文件

第一種方法,將我們所需要的動(dòng)畫(huà)文件loading.json保存在app/src/main/assets文件里。 第二種方法,網(wǎng)絡(luò)上AE生成的動(dòng)畫(huà)文件。

3.使用

在布局文件中使用

<com.airbnb.lottie.LottieAnimationView
        android:id="@+id/animation_view"
        android:layout_width="400dp"
        android:layout_height="400dp"
        app:lottie_fileName="loading.json"
        app:lottie_loop="true"
        app:lottie_autoPlay="true"/>

使用網(wǎng)絡(luò)加載AE生成的動(dòng)畫(huà)文件json

private void loadUrl(String url) {
    client.newCall(request).enqueue(new Callback() {
        @Override 
        public void onFailure(Call call, IOException e) {

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                try {
                    JSONObject json = new JSONObject(response.body().string());
                    LottieComposition.Factory
                            .fromJson(getResources(), json, new OnCompositionLoadedListener() {
                                @Override
                                public void onCompositionLoaded(LottieComposition composition) {
                                    setComposition(composition);
                                }
                            });
                } catch (JSONException e) {
                }
            }
        }
    });
}

private  void setComposition(LottieComposition composition){
    animation_view.setProgress(0);
    animation_view.loop(true);
    animation_view.setComposition(composition);
    animation_view.playAnimation();
}

四、Lottie實(shí)現(xiàn)原理

lottie動(dòng)畫(huà),android

設(shè)計(jì)師把一張復(fù)雜的圖片使用多個(gè)圖層來(lái)表示,每個(gè)圖層展示一部分內(nèi)容,圖層中的內(nèi)容也可以拆分為多個(gè)元素。拆分元素之后,根據(jù)動(dòng)畫(huà)需求,可以單獨(dú)對(duì)圖層或者圖層中的元素做平移、旋轉(zhuǎn)、收縮等動(dòng)畫(huà)。

Lottie的使用的資源是需要先通過(guò)bodymovin( bodymovin 插件本身是用于網(wǎng)頁(yè)上呈現(xiàn)各種AE效果的一個(gè)開(kāi)源庫(kù))將 Adobe After Effects (AE)生成的aep動(dòng)畫(huà)工程文件轉(zhuǎn)換為通用的json格式描述文件。Lottie則負(fù)責(zé)解析動(dòng)畫(huà)的數(shù)據(jù),計(jì)算每個(gè)動(dòng)畫(huà)在某個(gè)時(shí)間點(diǎn)的狀態(tài),準(zhǔn)確地繪制到屏幕上。

Lottie主要類圖:

lottie動(dòng)畫(huà),android

Lottie對(duì)外通過(guò)控件LottieAnimationView暴露接口,控制動(dòng)畫(huà)。

LottieAnimationView繼承自ImageView,通過(guò)當(dāng)前時(shí)間繪制canvas顯示到界面上。這里有兩個(gè)關(guān)鍵類:LottieComposition 負(fù)責(zé)解析json描述文件,把json內(nèi)容轉(zhuǎn)成Java數(shù)據(jù)對(duì)象;LottieDrawable負(fù)責(zé)繪制,把LottieComposition轉(zhuǎn)成的數(shù)據(jù)對(duì)象繪制成drawable顯示到View上。順序如下:

lottie動(dòng)畫(huà),android

解析json外部結(jié)構(gòu)LottieComposition封裝整個(gè)動(dòng)畫(huà)的信息,包括動(dòng)畫(huà)大小,動(dòng)畫(huà)時(shí)長(zhǎng),幀率,用到的圖片,字體,圖層等等。

{
    "v": "4.6.0",               //bodymovin的版本
    "fr": 29.9700012207031,     //幀率
    "ip": 0,                    //起始關(guān)鍵幀
    "op": 141.000005743048,     //結(jié)束關(guān)鍵幀
    "w": 800,                   //動(dòng)畫(huà)寬度
    "h": 800,                   //動(dòng)畫(huà)高度
    "ddd": 0, 
    "assets": [...]             //資源信息
    "layers": [...]             //圖層信息
}

解析圖片資源

"assets": [                 //資源信息
    {                       //第一張圖片
        "id": "image_0",    //圖片id
        "w": 58,            //圖片寬度
        "h": 31,            //圖片高度
        "u": "images/",     //圖片路徑
        "p": "img_0.png"    //圖片名稱
    },
    {...}                   //第n張圖片
]

解析圖層

"layers": [                 //圖層信息
    {                       //第一層動(dòng)畫(huà)
        "ddd": 0, 
        "ind": 0,           //layer id 圖層 id
        "ty": 4,            //圖層類型
        "nm": "center_circle", 
        "ks": {...},        //動(dòng)畫(huà)
        "ao": 0, 
        "shapes": [...], 
        "ip": 0,            //inFrame 該圖層起始關(guān)鍵幀
        "op": 90,           //outFrame 該圖層結(jié)束關(guān)鍵幀
        "st": 0,            //startFrame 開(kāi)始
        "bm": 0, 
        "sr": 1
    }, 
    {...}                   //第n層動(dòng)畫(huà)
]

如何動(dòng)起來(lái)時(shí)序圖

lottie動(dòng)畫(huà),android

利用屬性動(dòng)畫(huà)控制進(jìn)度,每次進(jìn)度改變通知到每一層,觸發(fā)LottieAnimationView重繪。代碼如下:

public LottieDrawable() {
    animator.setRepeatCount(0);
    animator.setInterpolator(new LinearInterpolator());
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            if (systemAnimationsAreDisabled) {
                animator.cancel();
                setProgress(1f);
            } else {
                setProgress((float) animation.getAnimatedValue());
            }
        }
    });
}

通過(guò)CompositionLayer把進(jìn)度傳遞到各個(gè)圖層

@Override
public void setProgress(@FloatRange(from = 0f, to = 1f) float progress) {
    super.setProgress(progress);
    if (timeRemapping != null) {
        long duration = lottieDrawable.getComposition().getDuration();
        long remappedTime = (long) (timeRemapping.getValue() * 1000);
        progress = remappedTime / (float) duration;
    }
    if (layerModel.getTimeStretch() != 0) {
        progress /= layerModel.getTimeStretch();
    }
    progress -= layerModel.getStartProgress();
    for (int i = layers.size() - 1; i >= 0; i--) {
        layers.get(i).setProgress(progress);
    }
}

通知進(jìn)度改變

void setProgress(@FloatRange(from = 0f, to = 1f) float progress) {
    if (progress < getStartDelayProgress()) {
      progress = 0f;
    } else if (progress > getEndProgress()) {
      progress = 1f;
    }

    if (progress == this.progress) {
      return;
    }
    this.progress = progress;

    for (int i = 0; i < listeners.size(); i++) {
      listeners.get(i).onValueChanged();
    }
  }

最終回調(diào)到LottieAnimationView的invalidateDrawable

@Override
public void invalidateDrawable(@NonNull Drawable dr) {
    if (getDrawable() == lottieDrawable) {
      // We always want to invalidate the root drawable so it redraws the whole drawable.
      // Eventually it would be great to be able to invalidate just the changed region.
        super.invalidateDrawable(lottieDrawable);
    } else {
      // Otherwise work as regular ImageView
        super.invalidateDrawable(dr);
    }
}

最后觸發(fā)LottieDrawable重繪

@Override
public void draw(@NonNull Canvas canvas) {
    ...
    matrix.reset();
    matrix.preScale(scale, scale);
    compositionLayer.draw(canvas, matrix, alpha);   //這里會(huì)調(diào)用所有l(wèi)ayer的繪制方法
    if (hasExtraScale) {
        canvas.restore();
    }
}

總結(jié)

1.劣勢(shì)
(1)性能不夠好—某些動(dòng)畫(huà)特效,內(nèi)存和性能不夠好;相對(duì)于屬性動(dòng)畫(huà),在展示大動(dòng)畫(huà)時(shí),幀率較低


2.優(yōu)勢(shì)
(1)開(kāi)發(fā)效率高—代碼實(shí)現(xiàn)簡(jiǎn)單,更換動(dòng)畫(huà)方便,易于調(diào)試和維護(hù)。
(2)數(shù)據(jù)源多樣性—可從assets,sdcard,網(wǎng)絡(luò)加載動(dòng)畫(huà)資源,能做到不發(fā)版本,動(dòng)態(tài)更新
(3)跨平臺(tái)—設(shè)計(jì)稿導(dǎo)出一份動(dòng)畫(huà)描述文件,android,ios,react native通用
(4) Lottie使用簡(jiǎn)單,易于上手,非常值得嘗試。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-858386.html

到了這里,關(guān)于Android 動(dòng)畫(huà) Lottie 如何使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3+vite中使用Lottie動(dòng)畫(huà)

    vue3+vite中使用Lottie動(dòng)畫(huà)

    Lottie通過(guò)讀取json文件信息實(shí)現(xiàn)動(dòng)畫(huà)效果 ? 官方文檔?Lottie官網(wǎng) lottie庫(kù)有眾多動(dòng)畫(huà) 選擇下載Lottie?JSON到項(xiàng)目中 安裝Lottie包 pnpm add lottie-web 模板創(chuàng)建 ?引入lottie-web以及動(dòng)畫(huà)json文件 import lottie from \\\'lottie-web\\\'; import transformJson from \\\"@/assets/json/playLottie.json\\\" js ? 動(dòng)畫(huà)生成?。?!?

    2024年02月07日
    瀏覽(23)
  • Lottie動(dòng)畫(huà)的優(yōu)劣及原理

    Lottie動(dòng)畫(huà)的優(yōu)劣及原理

    Lottie是目前應(yīng)用十分廣泛的動(dòng)畫(huà)框架。在周會(huì)匯報(bào)的時(shí)候,老板問(wèn)能不能對(duì)Lottie進(jìn)行優(yōu)化,于是就有了下文對(duì)Lottie原理的研究。畢竟要進(jìn)行優(yōu)化,首先要深入了解原理嘛。 Lottie通過(guò)讀取json文件信息實(shí)現(xiàn)動(dòng)畫(huà)效果。 json信息包括json整體結(jié)構(gòu)、圖片資源、圖層信息等,這些屬性

    2024年02月05日
    瀏覽(19)
  • OpenHarmony UI動(dòng)畫(huà)-lottie

    OpenHarmony UI動(dòng)畫(huà)-lottie

    lottie是一個(gè)適用于OpenHarmony的動(dòng)畫(huà)庫(kù),它可以解析Adobe After Effects軟件通過(guò)Bodymovin插件導(dǎo)出的json格式的動(dòng)畫(huà),并在移動(dòng)設(shè)備上進(jìn)行本地渲染。 OpenHarmony ohpm 環(huán)境配置等更多內(nèi)容,請(qǐng)參考如何安裝 OpenHarmony ohpm 包 前提:數(shù)據(jù)準(zhǔn)備 lottie動(dòng)畫(huà)文件是由設(shè)計(jì)人員使用Adobe After Effects軟件

    2024年04月28日
    瀏覽(22)
  • 微信小程序使用lottie-miniprogram插件。顯示json格式的動(dòng)畫(huà),手機(jī)上鋸齒模糊問(wèn)題

    https://github.com/wechat-miniprogram/lottie-miniprogram 使用辦法 通過(guò) npm 安裝: 傳入 canvas 對(duì)象用于適配

    2024年02月11日
    瀏覽(20)
  • 微信小程序通過(guò)lottie庫(kù)實(shí)現(xiàn)json動(dòng)畫(huà)

    微信小程序通過(guò)lottie庫(kù)實(shí)現(xiàn)json動(dòng)畫(huà)

    通過(guò)npm安裝Lottie庫(kù)(注意微信小程序使用lottie-miniprogram,vue項(xiàng)目使用 lottie-web) 把ui提供的json文件動(dòng)畫(huà)改成js文件并通過(guò)module.exports導(dǎo)出文件 在頁(yè)面wxml文件創(chuàng)建一個(gè)canvas標(biāo)簽來(lái)存放動(dòng)畫(huà)(注意這里canvas需要包裹在view標(biāo)簽中并設(shè)置 style=\\\"width: 100%;height: 100%;) 在頁(yè)面ts文件中使用

    2024年02月11日
    瀏覽(21)
  • 微信小程序使用lottie動(dòng)圖插件

    微信小程序使用lottie動(dòng)圖插件

    1、通過(guò)npm安裝Lottie庫(kù) npm install --save lottie-miniprogram 2、npm?構(gòu)建 1)npm init 2)微信開(kāi)發(fā)者工具中?點(diǎn)擊? 工具一構(gòu)建npm 3、js文件里引用 4、wxml文件使用canvas 5、js方法調(diào)用 ? ? ?注:json路徑為小程序合法域名下服務(wù)器上的文件,可將文件夾整體扔到服務(wù)器上 6、效果展示

    2024年02月04日
    瀏覽(21)
  • Android 使用motion 動(dòng)畫(huà)如何使用

    MotionLayout 是 Android 中的一個(gè)強(qiáng)大的布局容器,它可以用來(lái)創(chuàng)建復(fù)雜的動(dòng)畫(huà)和過(guò)渡效果,允許你在布局中定義多個(gè)狀態(tài),并在這些狀態(tài)之間進(jìn)行平滑的動(dòng)畫(huà)過(guò)渡。以下是使用 MotionLayout 創(chuàng)建動(dòng)畫(huà)的基本步驟: 1. 添加依賴: 首先,確保在你的 app 模塊的 build.gradle 文件中添加以下

    2024年02月09日
    瀏覽(16)
  • Android Activity 動(dòng)畫(huà)如何實(shí)現(xiàn)

    在 Android 中,你可以使用 Activity 轉(zhuǎn)場(chǎng)動(dòng)畫(huà)來(lái)實(shí)現(xiàn) Activity 之間的切換動(dòng)畫(huà)效果。以下是一些常見(jiàn)的 Activity 轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的實(shí)現(xiàn)方法: 1. 使用 XML 文件定義動(dòng)畫(huà)效果: 首先,在 res/anim 目錄下創(chuàng)建 XML 文件來(lái)定義你的動(dòng)畫(huà)效果。例如,你可以創(chuàng)建 fade_in.xml 和 fade_out.xml 文件來(lái)定義淡入

    2024年02月09日
    瀏覽(16)
  • Android View動(dòng)畫(huà)之LayoutAnimation的使用

    Android View動(dòng)畫(huà)之LayoutAnimation的使用

    接前篇 Android View動(dòng)畫(huà)整理 ,本篇介紹 LayoutAnimation 的使用。 參考《安卓開(kāi)發(fā)藝術(shù)探索》。 View 動(dòng)畫(huà)作用于 View 。 LayoutAnimation 則作用于 ViewGroup , 為 ViewGoup 指定一個(gè)動(dòng)畫(huà),ViewGoup 的子 View 出場(chǎng)時(shí)就具體動(dòng)畫(huà)效果。 簡(jiǎn)言之,LayoutAnimation 是為 ViewGroup 的子View指定出場(chǎng)動(dòng)畫(huà)。 開(kāi)

    2024年02月11日
    瀏覽(21)
  • 騰訊出品Pag動(dòng)畫(huà)框架在Android端的使用-網(wǎng)絡(luò)Pag加載

    在我們可以通過(guò)assets的方式加在pag文件之后,我們會(huì)考慮下一個(gè)問(wèn)題,可不可以用Pag框架加載網(wǎng)絡(luò)文件? 為什么會(huì)有這樣的問(wèn)題出現(xiàn),或者說(shuō)網(wǎng)絡(luò)方式加載可以解決什么問(wèn)題? APK 體積增加問(wèn)題 當(dāng)一個(gè)項(xiàng)目規(guī)模比較大的時(shí)候,會(huì)做很多優(yōu)化工作,其中「APK瘦身」便是一項(xiàng)優(yōu)化

    2024年02月13日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包