A、json文件和圖片資源分開
delete 是json資源名字
/res/lottie/delete_anim_images是圖片資源文件夾路徑
JSON 中引用的圖片名,必須與實際圖片文件名一致
?
B、json文件和圖片資源分開,并且圖片加載不固定
比如我有7張圖片,分別命名1~7,我可以根據邏輯從這7張圖片里面選3張圖片,放到lottie里面顯示嗎?
?
Lottie 本身不支持在動畫過程中動態替換圖片(比如從一堆圖片中動態挑選幾張替換),因為它的圖片資源是綁定在 JSON 文件里的,JSON 中的
assets
數組會預定義所有圖片名和 ID。
但!我們可以通過 “間接替換圖片”
? 能實現需求的方法一:使用動態 ImageProvider 替換指定 ID 對應的圖片
在 lottie-ios 4.x
中,你可以通過 實現自定義 ImageProvider 的方式,讓某個 ID 返回你希望的圖片內容。
🛠? 一、動畫 JSON 的設計要求(由設計師完成)
使用 Adobe After Effects + Bodymovin 插件導出
?關鍵要求
-
設計師添加 3 個圖片圖層(img1、img2、img3)
-
命名保持統一(就是圖層名叫
img1
、img2
、img3
) -
每個圖層引用一張占位圖(比如 placeholder.png)
-
導出時取消勾選 Embed Image(不要將圖片嵌入 JSON)
-
勾選導出圖像 → 會導出 JSON 和圖像目錄
最終導出結果是一個
.json
文件 + 一個images
文件夾,文件夾里包含img1.png
、img2.png
、img3.png
(占位圖)
🧱 二、你的 App 中資源結構如下:
📦 MyApp
├── Assets
│ ├── lottie_template.json
│ └── images
│ ├── 1.png
│ ├── 2.png
│ ├── 3.png
│ ├── 4.png
│ ├── 5.png
│ ├── 6.png
│ └── 7.png
🧩 三、自定義 ImageProvider 來實現圖片替換
class DynamicImageProvider: AnimationImageProvider {private let imageMap: [String: UIImage]init(imageMap: [String: UIImage]) {self.imageMap = imageMap}func imageForAsset(asset: ImageAsset) -> CGImage? {// asset.name 是 JSON 中 image 圖層的 name,例如 "img1"guard let image = imageMap[asset.name] else { return nil }return image.cgImage}
}
🧪 四、使用示例代碼(Swift 5.0)
// 假設你有 1~7.png 放在項目中
let allImageNames = ["1", "2", "3", "4", "5", "6", "7"]
let selected = allImageNames.shuffled().prefix(3)let imageMap: [String: UIImage] = ["img1": UIImage(named: selected[0])!,"img2": UIImage(named: selected[1])!,"img3": UIImage(named: selected[2])!
]let provider = DynamicImageProvider(imageMap: imageMap)guard let animation = LottieAnimation.named("lottie_template") else { return }let animationView = LottieAnimationView(animation: animation, imageProvider: provider)
animationView.frame = view.bounds
animationView.contentMode = .scaleAspectFit
animationView.loopMode = .loop
animationView.play()view.addSubview(animationView)
? 效果:每次啟動動畫時都會在 img1、img2、img3 圖層上顯示隨機選的圖片 🎉
? 前提是你的 Lottie JSON 中,assets
用的是 "img1"
, "img2"
這樣的 ID。然后你可以在運行時替換這些 ID 對應的 UIImage 內容。
👀 注意事項
-
imageMap
中的 key 一定要與 JSON 中的圖層名字一致(比如"img1"
) -
圖片名與
UIImage(named:)
要匹配,確保加入到 Xcode 工程或 Assets 里 -
JSON 動畫圖層是固定的 3 個,你替換的是內容,不是數量
? 優點
-
一個 JSON 動畫文件即可
-
圖片資源獨立管理,邏輯控制簡單
-
沒有生成多個動畫文件,App 體積更小
疑問?
🕹? imageForAsset 是什么時候調用的?
-
當你用下面代碼播放動畫時:
let animationView = LottieAnimationView(animation: animation, imageProvider: provider)
animationView.play()
-
animationView.play()
開始渲染動畫時,Lottie 內部會解析 JSON,發現某些圖層是圖片(例如"img1"
) -
然后 Lottie 就會調用你寫的
imageForAsset(asset:)
方法 來獲取它需要的圖片
也就是說:
每當動畫里有個
image
圖層需要渲染,都會走一次imageForAsset()
—— 你可以在里面決定顯示哪張圖!
💥 會不會沖突?
不會!你自定義了 ImageProvider
,Lottie 會優先走你提供的圖:
-
如果你沒設置
imageProvider
,它就會去讀"img1.png"
文件 -
如果你設置了自定義
DynamicImageProvider
,它就會調用:
imageForAsset(asset: ImageAsset(name: "img1"))
你返回什么圖,它就顯示什么圖,和 JSON 原來的 p: img1.png
沒關系了!