Android 如何使用 Lottie 提供多张图片
How to provide multiple images with Lottie on Android
我正在开发一个带有 Lottie 动画的应用程序。其中一个lottie动画需要两个图片文件(img_0.png, img1_.png).
例如,
lottie json file [ data.json ] : {"v":"5.1.7","fr":60,"ip":0,"op":120,"w":180,"h":200,"nm":"2","ddd":0,"assets":[{"id":"image_0","w":96,"h":96,"u":"images/","p":"img_0.png"},{"id":"image_1","w":180,"h":180,"u":"images/","p":"img_1.png"}],....
我无法在 main/assets 文件夹中为 LottieAnimationView 准备所有图像,因此我使用“setImageAssetDelegate”方法从 URL 异步获取多个图像。
这是我的代码:
Glide.with(this)
.asBitmap()
.load("https://www.google.co.kr/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png")
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(final Bitmap resource, Transition<? super Bitmap> transition) {
LottieAnimationView lottie = findViewById(R.id.lottie);
lottie.setImageAssetDelegate(new ImageAssetDelegate() {
@Override
public Bitmap fetchBitmap(LottieImageAsset asset) {
return resource;
}
});
lottie.playAnimation();
}
});
但是如果我使用“setImageAssetDelegate”方法,我只能将一张图片放到Lottie。我想在一个 Lottie 动画中放置多个不同的图像。
我不想要这个。 (上面的代码显示了这个动画)。
我需要使用“setImageAssetDelegate”方法。
有人对此有任何想法吗?
异步获取图像将不起作用。
ImageAssetDelegate
是动画播放时需要的 "provider" 个图像。
它的方法 public Bitmap fetchBitmap(LottieImageAsset asset)
将在动画播放时为动画中的每个图像调用,您有责任提供正确的图像,其中传递给该方法的 LottieImageAsset 将提供您可以从动画 json
文件中获取当时需要的图像的详细信息。
您可以使用 Glide
来获取这些图像,但请记住,您必须同步获取它们,并且在您加载/提供该图像之前动画不会继续播放。
一个例子:
LottieAnimationView lottie = findViewById(R.id.lottie);
lottie.setImageAssetDelegate(new ImageAssetDelegate() {
@Override
public Bitmap fetchBitmap(LottieImageAsset asset) {
return Glide.loadSychronous("http://" + asset.getId + ".png");
}
});
lottie.playAnimation();
注意:这是伪代码,您必须查找如何使用 Glide
同步加载图像,并且您必须想出一种方法将图像 ID 与正确的匹配图片 url。
另一种方法是使用 Glide
加载 所有 动画所需的图像,保存它们(在内存或外部存储器中)然后才开始播放动画;这可能适用于小动画;对于任何更大的东西,你 运行 都会遇到麻烦,因为 a.加载所有图像花费的时间太长或 b。你 运行 内存不足。
这就是您将图像动态加载到 lottie 中的方法。在这个例子中,我通过 URL 加载。您也可以类似地加载捆绑图像。
Glide.with(this)
.asBitmap()
.load(url)
.into(object : CustomTarget<Bitmap>(){
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
lottie.addLottieOnCompositionLoadedListener {
val scaledBitmap = Bitmap.createScaledBitmap(resource, 282, 167, false)
lottie.updateBitmap("image_0", scaledBitmap)
}
}
override fun onLoadCleared(placeholder: Drawable?) {
}
})
image_0 是你要在 lottie json 中“assets”对象下替换的图像的 id。
您也可以对 image_1 重复此过程。
"assets": [{
"id": "image_0",
"w": 282,
"h": 167,
"u": ""}]
缩放位图是可选的。
我正在开发一个带有 Lottie 动画的应用程序。其中一个lottie动画需要两个图片文件(img_0.png, img1_.png).
例如,
lottie json file [ data.json ] : {"v":"5.1.7","fr":60,"ip":0,"op":120,"w":180,"h":200,"nm":"2","ddd":0,"assets":[{"id":"image_0","w":96,"h":96,"u":"images/","p":"img_0.png"},{"id":"image_1","w":180,"h":180,"u":"images/","p":"img_1.png"}],....
我无法在 main/assets 文件夹中为 LottieAnimationView 准备所有图像,因此我使用“setImageAssetDelegate”方法从 URL 异步获取多个图像。
这是我的代码:
Glide.with(this)
.asBitmap()
.load("https://www.google.co.kr/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png")
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(final Bitmap resource, Transition<? super Bitmap> transition) {
LottieAnimationView lottie = findViewById(R.id.lottie);
lottie.setImageAssetDelegate(new ImageAssetDelegate() {
@Override
public Bitmap fetchBitmap(LottieImageAsset asset) {
return resource;
}
});
lottie.playAnimation();
}
});
但是如果我使用“setImageAssetDelegate”方法,我只能将一张图片放到Lottie。我想在一个 Lottie 动画中放置多个不同的图像。
我不想要这个。 (上面的代码显示了这个动画)。
我需要使用“setImageAssetDelegate”方法。
有人对此有任何想法吗?
异步获取图像将不起作用。
ImageAssetDelegate
是动画播放时需要的 "provider" 个图像。
它的方法 public Bitmap fetchBitmap(LottieImageAsset asset)
将在动画播放时为动画中的每个图像调用,您有责任提供正确的图像,其中传递给该方法的 LottieImageAsset 将提供您可以从动画 json
文件中获取当时需要的图像的详细信息。
您可以使用 Glide
来获取这些图像,但请记住,您必须同步获取它们,并且在您加载/提供该图像之前动画不会继续播放。
一个例子:
LottieAnimationView lottie = findViewById(R.id.lottie);
lottie.setImageAssetDelegate(new ImageAssetDelegate() {
@Override
public Bitmap fetchBitmap(LottieImageAsset asset) {
return Glide.loadSychronous("http://" + asset.getId + ".png");
}
});
lottie.playAnimation();
注意:这是伪代码,您必须查找如何使用 Glide
同步加载图像,并且您必须想出一种方法将图像 ID 与正确的匹配图片 url。
另一种方法是使用 Glide
加载 所有 动画所需的图像,保存它们(在内存或外部存储器中)然后才开始播放动画;这可能适用于小动画;对于任何更大的东西,你 运行 都会遇到麻烦,因为 a.加载所有图像花费的时间太长或 b。你 运行 内存不足。
这就是您将图像动态加载到 lottie 中的方法。在这个例子中,我通过 URL 加载。您也可以类似地加载捆绑图像。
Glide.with(this)
.asBitmap()
.load(url)
.into(object : CustomTarget<Bitmap>(){
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
lottie.addLottieOnCompositionLoadedListener {
val scaledBitmap = Bitmap.createScaledBitmap(resource, 282, 167, false)
lottie.updateBitmap("image_0", scaledBitmap)
}
}
override fun onLoadCleared(placeholder: Drawable?) {
}
})
image_0 是你要在 lottie json 中“assets”对象下替换的图像的 id。 您也可以对 image_1 重复此过程。
"assets": [{
"id": "image_0",
"w": 282,
"h": 167,
"u": ""}]
缩放位图是可选的。