使用lottie加載json動(dòng)畫

github代碼傳送門

先上效果圖,這個(gè)是做的一個(gè)仿抖音的點(diǎn)贊動(dòng)畫:


giphy.gif

眾所周知,屬性動(dòng)畫付鹿、補(bǔ)間動(dòng)畫通常只能做一些效果簡單的缓呛,而做復(fù)雜的動(dòng)畫可采用gif圖,幀動(dòng)畫傅寡,但是這樣資源空間增大導(dǎo)致apk增大不小。而加載json文件實(shí)現(xiàn)動(dòng)畫就完美解決以上問題。

設(shè)計(jì)師AE導(dǎo)出Json文件荐操,Lotti 解析Json文件后調(diào)Core Animation的API繪制渲染大猛。所以讓你們公司的UI去學(xué)一學(xué)AE吧,多們技能好防身淀零。

Lottie開源庫地址:一個(gè)集Android挽绩、Ios、React Native與Web平臺(tái)于一身的女子驾中。

https://github.com/airbnb/lottie-android

使用方式:

  1. 引入庫
    compile 'com.airbnb.android:lottie:1.0.1'
  1. 創(chuàng)建assets文件夾唉堪,將json文件放入其中。


    image.png
  1. 引用LottieAnimationView控件
    <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/lottie_likeanim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:lottie_fileName="likeanim.json"
        app:lottie_loop="true"
        android:layout_centerInParent="true"/>

常用屬性:

      app:lottie_fileName="likeanim.json"  加載json的文件名
      app:lottie_loop="true"  是否循環(huán)播放
      app:lottie_autoPlay="true"  是否自動(dòng)播放

常用操作:

       lottieLike.playAnimation();   //播放
        lottieLike.pauseAnimation();  //暫停
        lottieLike.cancelAnimation();  //取消
        lottieLike.getDuration();   //獲取動(dòng)畫時(shí)長
        lottieLike.addAnimatorListener(new Animator.AnimatorListener() {  //添加動(dòng)畫監(jiān)聽
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
lottie動(dòng)畫原理

上圖是Lottie動(dòng)畫庫從AE導(dǎo)出動(dòng)畫到繪制到客戶端屏幕的過程肩民,第一階段是JSON到Model(OC數(shù)據(jù)模型)的轉(zhuǎn)換過程唠亚,主要是將JSON轉(zhuǎn)成OC語言可以識(shí)別的數(shù)據(jù)模型Model, Model實(shí)際上是一個(gè)Object類型的對象,我們可以通過屬性key快速查找數(shù)據(jù)內(nèi)容持痰,第二階段是Model(數(shù)據(jù)模型)依附到CALayer(圖層)上灶搜,就像寫一個(gè)CALayer一樣,把Model數(shù)據(jù)一一賦值給CALayer的屬性上工窍,必要時(shí)再做特殊處理割卖,最后在圖層CALayer上添加Animation(動(dòng)畫)。

JSON字段解讀

JSON最外一層的數(shù)據(jù)患雏,包括一個(gè)動(dòng)畫的基礎(chǔ)數(shù)據(jù):動(dòng)畫幀率鹏溯、起始/結(jié)束關(guān)鍵幀,動(dòng)畫的寬高等淹仑,還有子圖層的信息和關(guān)聯(lián)的資源信息丙挽,如圖片,矢量圖等匀借。

{
  "v": "5.6.10",   // bodymovin插件版本
  "fr": 25,        // 幀率
  "ip": 0,         // 起始關(guān)鍵幀
  "op": 277,       // 結(jié)束關(guān)鍵幀
  "w": 110,        // 視圖寬度
  "h": 110,        // 視圖高度
  "nm": "cloud",   // 動(dòng)畫名稱
  "ddd": 0,        // 是否是3D
  "assets": [...]  // 資源集合
  "layers": [...]  // 圖層集合
}

assets 資源集合
assets是一個(gè)數(shù)組颜阐,資源信息包含的是矢量圖信息,如形狀吓肋,大小等等凳怨,也包含位圖;還可能是預(yù)合成層蓬坡,即對已存在的某些圖層進(jìn)行分組猿棉,把它們放置到新的合成中,作為新的一個(gè)資源對象屑咳,這里layers的對象結(jié)構(gòu)是跟上面一級(jí)屬性中的layers圖層集合是一樣的圖層結(jié)構(gòu)萨赁。

"assets": [
    {
        "id": "image_0",   // 圖片唯一識(shí)別的id,圖層獲取圖片的標(biāo)識(shí)
        "w": 167,          // 圖片的寬度
        "h": 165,          // 圖片的高度
        "u": "images/",    // 圖片的路徑
        "p": "img_0.png",  // 圖片的名稱
        "layers":  []      // 預(yù)合成層
    }
]

layers 圖層集合
layers對象也是一個(gè)數(shù)組兆龙,數(shù)組中的每個(gè)元素對應(yīng)一個(gè)圖層杖爽,圖層信息包括的圖層的位置敲董,大小,形狀慰安,起始關(guān)鍵幀腋寨,結(jié)束關(guān)鍵幀等,一個(gè)個(gè)圖層動(dòng)畫疊加起來構(gòu)成最終的動(dòng)畫效果化焕。

"layers": [
    {
        "ddd": 0,             // 是否是3D圖層
        "ind": 1,             // 在AE里的圖層標(biāo)序號(hào)
        "ty": 4,              // 圖層類型
        "nm": "形狀圖層 1",    // 在AE下的命名
        "ks": {},             // 動(dòng)畫屬性值萄窜,下面有進(jìn)一步拆解
        "shapes": {},         // 矢量圖形圖層信息,下面有進(jìn)一步拆解
        "ip": 0,              // 起始關(guān)鍵幀
        "op": 750,            // 結(jié)束關(guān)鍵幀
        "refId: 0,            // 引用資源ID
        "parent": 0,          // 父圖層的id撒桨,默認(rèn)都添加到根圖層上查刻,如果指定了id不為0會(huì)尋找父圖層并添加到上面
        "masksProperties":[], // 蒙版的數(shù)組
        "w": 100,             // 預(yù)合成層:寬度
        "h": 100,             // 預(yù)合成層:圖層高度
        "sw": 0,              // 固態(tài)層:寬度
        "sh": 0,              // 固態(tài)層:圖層高度
        "sc": 0 ,             // 固態(tài)層:顏色
    }
]

參考:
https://cloud.tencent.com/developer/article/1655236

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凤类,隨后出現(xiàn)的幾起案子穗泵,更是在濱河造成了極大的恐慌,老刑警劉巖谜疤,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佃延,死亡現(xiàn)場離奇詭異,居然都是意外死亡夷磕,警方通過查閱死者的電腦和手機(jī)履肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來企锌,“玉大人榆浓,你說我怎么就攤上這事于未∷涸埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵烘浦,是天一觀的道長抖坪。 經(jīng)常有香客問我,道長闷叉,這世上最難降的妖魔是什么擦俐? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮握侧,結(jié)果婚禮上蚯瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己品擎,他們只是感情好埋合,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萄传,像睡著了一般甚颂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天振诬,我揣著相機(jī)與錄音蹭睡,去河邊找鬼。 笑死赶么,一個(gè)胖子當(dāng)著我的面吹牛肩豁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辫呻,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蓖救,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了印屁?” 一聲冷哼從身側(cè)響起循捺,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雄人,沒想到半個(gè)月后震桶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谐腰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哮肚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡很钓,死狀恐怖香府,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情码倦,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布袁稽,位于F島的核電站,受9級(jí)特大地震影響推汽,放射性物質(zhì)發(fā)生泄漏补疑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一歹撒、第九天 我趴在偏房一處隱蔽的房頂上張望莲组。 院中可真熱鬧,春花似錦胁编、人聲如沸厢钧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽市框。三九已至霞扬,卻和暖如春枫振,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粪滤。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來泰國打工斧拍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杖小,地道東北人肆汹。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓予权,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扫腺。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容