文章大綱 一、Lottie介紹二、Lottie實戰三、項目源碼下載四、參考文章 一、Lottie介紹 1. 什麼是Lottie Lottie是Android和iOS的移動庫,用於解析Adobe After Effects動畫與Bodymovin一起導出為json 併在移動設備上呈現它們!其實在移動端 ...
文章大綱
一、Lottie介紹
二、Lottie實戰
三、項目源碼下載
四、參考文章
一、Lottie介紹
1. 什麼是Lottie
Lottie是Android和iOS的移動庫,用於解析Adobe After Effects動畫與Bodymovin一起導出為json 併在移動設備上呈現它們!其實在移動端就是通過一個json文件顯示相應的動畫,其實這樣很好的解決了動態改變動畫的能力,只需要動態載入相應的josn文件就能實現動畫的改變。(josn由美工提供)
2. Lottie優點
(1)能夠解析渲染通過 AE 上的 Bodymovin 插件將 AE 中製作好的動畫導出成的 json 文件
(2)數據源多樣性—可從assets,sdcard,網路載入動畫資源,動態更新
(3)跨平臺—設計稿導出一份動畫描述文件,android,ios,react native通用(android使用的api不能低於16)
3. Lottie動畫製作流程圖
4. Lottie例子
二、Lottie實戰
1. 常見的API介紹
(1)判斷是否動畫正在運行中
isAnimating()
(2)設置動畫的進度值(float值)
setProgress();
(3)監聽動畫進度
addAnimatorUpdateListener
(4)開始動畫
playAnimation()
(5)動態設置json文件
setComposition
2. 代碼實操
(1)在項目的 build.gradle 文件添加依賴
dependencies {
implementation 'com.android.support:appcompat-v7:24+'
//lottie依賴
implementation 'com.airbnb.android:lottie:1.0.1'
//網路請求相關依賴
implementation 'com.squareup.okhttp3:okhttp:3.5.0'
}
(2)相關json文件
(3)xml載入Lottie動畫
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<!--如此,動畫就能跑起來了,解釋下一下屬性:
1.lottie_fileName:在app/src/main/assets目錄下的動畫json文件名。
2.lottie_loop:動畫是否迴圈播放,預設不迴圈播放。
3.lottie_autoPlay:動畫是否自動播放,預設不自動播放。
4.alottie_imageAssetsFolder:動畫所依賴的圖片目錄,在pp/src/main/assets/目錄下的子目錄,該子目錄存放所有圖片。-->
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:lottie_fileName="data.json"
app:lottie_loop="true"
app:lottie_autoPlay="true"/>
</LinearLayout>
其他常見api:
(1)lottie_repeatCount 重覆次數
(2)lottie_repeatMode 設置動畫的重覆模式RESTART:重覆、REVERSE:反向
(3)lottie_colorFilter 設置動畫的著色顏色,這個就是把你的動畫變成了一個顏色的了
Activity代碼如下所示
/**
* 簡單動畫
*/
public class SimpleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// activity_simple.xml中 lottie_fileName="data.json"
// 所以只需要在 app/src/main/assets 中添加AE 生成的 json文件,重命名為data.json就可以顯示動畫
setContentView(R.layout.activity_simple);
}
}
(4)Activity中載入Lottie
xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="horizontal"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation_view_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@android:color/white"
android:textSize="16sp" />
<Button
android:id="@+id/button1"
android:layout_width="100dip"
android:layout_height="40dip"
android:background="@color/colorPrimary"
android:text="開始動畫" />
<Button
android:id="@+id/button2"
android:layout_width="100dip"
android:layout_height="40dip"
android:layout_marginLeft="10dip"
android:background="@color/colorPrimary"
android:text="結束動畫" />
</LinearLayout>
</LinearLayout>
Activity代碼如下
package com.zkk.lottietest;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.model.LottieComposition;
public class ClickActivity extends AppCompatActivity {
private Button button1,button2;
private TextView tv_seek;
LottieAnimationView animation_view_click;
@SuppressLint("RestrictedApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_click);
animation_view_click=(LottieAnimationView)findViewById(R.id.animation_view_click);
tv_seek=(TextView)findViewById(R.id.tv_seek);
button1=(Button)findViewById(R.id.button1);
button2=(Button)findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startAnima();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopAnima();
}
});
//代碼設置Lottie
LottieComposition.fromAssetFileName(this, "LottieLogo1.json", new LottieComposition.OnCompositionLoadedListener() {
@Override
public void onCompositionLoaded(LottieComposition composition) {
animation_view_click.setComposition(composition);
animation_view_click.setProgress(0.333f);//progress範圍0~1f,設置動畫進度
animation_view_click.playAnimation();//播放動畫
}
});
//動畫狀態監聽回調
animation_view_click.addAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
tv_seek.setText(" 動畫進度" +(int) (animation.getAnimatedFraction()*100) +"%");
}
});
}
/*
* 開始動畫
*/
private void startAnima(){
//判斷動畫是否在運行
boolean inPlaying = animation_view_click.isAnimating();
if (!inPlaying) {
animation_view_click.setProgress(0f);//設置開始時的進度值
animation_view_click.playAnimation();
}
}
/*
* 停止動畫
*/
private void stopAnima(){
//判斷動畫是否在運行
boolean inPlaying = animation_view_click.isAnimating();
if (inPlaying) {
animation_view_click.cancelAnimation();
}
}
@Override
protected void onStop() {
super.onStop();
animation_view_click.cancelAnimation();
}
}
(5)網路載入動畫
xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation_view_network"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Activity代碼如下
package com.zkk.lottietest;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.model.LottieComposition;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* 網路請求動畫
*/
public class NetworkActivity extends AppCompatActivity {
LottieAnimationView animation_view_network;//Lottie組件
private OkHttpClient client;//Okhttp客戶端
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_network);
//獲取Lottie組件
animation_view_network=(LottieAnimationView)findViewById(R.id.animation_view_network);
//線上載入Lottie的json
loadUrl("http://cdn.trojx.me/blog_raw/lottie_data_edit.json");
}
private void loadUrl(String url) {
Request request;
try {
request = new Request.Builder()
.url(url)
.build();
} catch (IllegalArgumentException e) {
return;
}
if (client == null) {
client = new OkHttpClient();
}
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
}
@SuppressLint("RestrictedApi")
@Override public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
}
try {
//獲取返回的json內容
JSONObject json = new JSONObject(response.body().string());
//設置動畫
LottieComposition
.fromJson(getResources(), json, new LottieComposition.OnCompositionLoadedListener() {
@Override
public void onCompositionLoaded(LottieComposition composition) {
setComposition(composition);
}
});
} catch (JSONException e) {
}
}
});
}
private void setComposition(LottieComposition composition){
animation_view_network.setProgress(0);//設置當前進度
animation_view_network.loop(true);//動畫是否迴圈播放
animation_view_network.setComposition(composition);
animation_view_network.playAnimation();//開始動畫
}
@Override
protected void onStop() {
super.onStop();
animation_view_network.cancelAnimation();//取消動畫
}
}
三、項目源碼下載
鏈接:https://pan.baidu.com/s/1fflg3Gmws-hh_3nj1N7fwg
密碼:1etb
四、參考文章
- https://blog.csdn.net/qq_15538877/article/details/80503773
- https://www.jianshu.com/p/282d098cf928?utm_source=oschina-app