如何更改 lottie json 文件中的单个图像
How do I change the a single image in the lottie json file
我用 adobe After Effects 制作了一个动画,并导出了带有图像的 JSON
文件并且它有效,因为我从资产文件夹中放入了照片。
我想更改 JSON
文件中的其中一张图片
"assets": [
{
"id": "image_0",
"w": 960,
"h": 540,
"u": "images/",
"p": "img_0.png"
}
这是 JSON
文件的一部分,我不知道如何更改它或更改名称或以编程方式设置图像
换句话说,我想更改从我的 java 代码中选择的特定图片,然后放另一张图片,例如更改衬衫图片。
您可以解析 json 文件,进行更改并将这些更改再次放入 json 文件中。虽然你将无法做任何事情
write/update
在您的 json 文件中,如果它存储在资产文件夹中。
经过一番研究找到了答案,只需使用此功能即可
lottieAnimationView.updateBitmap("the id of the image which is found in the json file",thebitmap);
经过大量研究,我发现有两种方法可以更改动画 Lotte 中的图像 json。
正如@Nour Ahmed 提到的,updateBitmap()
是正确的方法。但是,有一个微妙的提醒,您必须确保 LottieAnimationView
完全充气并且可见。大多数情况下,您在 onCreate()
中更新图像,它不起作用。因此,制作一个延迟几毫秒的技巧:
// Bug Lottie @@.
lavChest.postDelayed(new Runnable() {
@Override
public void run() {
// UPDATE 2020 AUG 07.
// Some devices require you to set image Assets folder again.
lavChest.setImageAssetsFolder("aep/reward/images");
lavChest.updateBitmap("image_6", bmReward);
lavChest.updateBitmap("image_2", bmNo);
lavChest.updateBitmap("image_4", bmCategory);
lavChest.playAnimation();
}
}, 500);
第二种方法是使用setImageAssetDelegate()
,不过它只能使用一次。
lavChest.setImageAssetDelegate(new ImageAssetDelegate() {
@Nullable
@Override
public Bitmap fetchBitmap(LottieImageAsset asset) {
switch (asset.getId()) {
case "image_6":
return bmReward;
case "image_2":
return bmNo;
case "image_4":
return bmCategory;
default:
AssetManager am = activity.getAssets();
try {
return BitmapFactory.decodeStream(am.open("aep/" + asset.getDirName() + asset.getFileName()));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
});
lavChest.playAnimation();
尽管关闭包含您的 LottieAnimationView
的屏幕,图像仍保留在 Lottie 缓存中。除非您关闭应用程序,否则没有适当的方法来干扰此缓存。
结论:
- 第一次使用
setImageAssetDelegate()
更新图像。
- 使用 updateBitmap() 更新图像下次。注意,
LottieAnimationView
需要 完全 可见。
@Nguyen Tan Dat 答案解决了我的疑问,谢谢
lavChest.postDelayed(new Runnable() {
@Override
public void run() {
lavChest.updateBitmap("image_6", bmReward);
lavChest.updateBitmap("image_2", bmNo);
lavChest.updateBitmap("image_4", bmCategory);
lavChest.playAnimation();
}
}, 500);
updateBitmap应该在setComposition之后执行。因为setComposition方法会执行setImageDrawable(null) 。这将回收位图
我用 adobe After Effects 制作了一个动画,并导出了带有图像的 JSON
文件并且它有效,因为我从资产文件夹中放入了照片。
我想更改 JSON
文件中的其中一张图片
"assets": [
{
"id": "image_0",
"w": 960,
"h": 540,
"u": "images/",
"p": "img_0.png"
}
这是 JSON
文件的一部分,我不知道如何更改它或更改名称或以编程方式设置图像
换句话说,我想更改从我的 java 代码中选择的特定图片,然后放另一张图片,例如更改衬衫图片。
您可以解析 json 文件,进行更改并将这些更改再次放入 json 文件中。虽然你将无法做任何事情
write/update
在您的 json 文件中,如果它存储在资产文件夹中。
经过一番研究找到了答案,只需使用此功能即可
lottieAnimationView.updateBitmap("the id of the image which is found in the json file",thebitmap);
经过大量研究,我发现有两种方法可以更改动画 Lotte 中的图像 json。
正如@Nour Ahmed 提到的,
updateBitmap()
是正确的方法。但是,有一个微妙的提醒,您必须确保LottieAnimationView
完全充气并且可见。大多数情况下,您在onCreate()
中更新图像,它不起作用。因此,制作一个延迟几毫秒的技巧:// Bug Lottie @@. lavChest.postDelayed(new Runnable() { @Override public void run() { // UPDATE 2020 AUG 07. // Some devices require you to set image Assets folder again. lavChest.setImageAssetsFolder("aep/reward/images"); lavChest.updateBitmap("image_6", bmReward); lavChest.updateBitmap("image_2", bmNo); lavChest.updateBitmap("image_4", bmCategory); lavChest.playAnimation(); } }, 500);
第二种方法是使用
setImageAssetDelegate()
,不过它只能使用一次。lavChest.setImageAssetDelegate(new ImageAssetDelegate() { @Nullable @Override public Bitmap fetchBitmap(LottieImageAsset asset) { switch (asset.getId()) { case "image_6": return bmReward; case "image_2": return bmNo; case "image_4": return bmCategory; default: AssetManager am = activity.getAssets(); try { return BitmapFactory.decodeStream(am.open("aep/" + asset.getDirName() + asset.getFileName())); } catch (IOException e) { e.printStackTrace(); return null; } } } }); lavChest.playAnimation();
尽管关闭包含您的 LottieAnimationView
的屏幕,图像仍保留在 Lottie 缓存中。除非您关闭应用程序,否则没有适当的方法来干扰此缓存。
结论:
- 第一次使用
setImageAssetDelegate()
更新图像。 - 使用 updateBitmap() 更新图像下次。注意,
LottieAnimationView
需要 完全 可见。
@Nguyen Tan Dat 答案解决了我的疑问,谢谢
lavChest.postDelayed(new Runnable() {
@Override
public void run() {
lavChest.updateBitmap("image_6", bmReward);
lavChest.updateBitmap("image_2", bmNo);
lavChest.updateBitmap("image_4", bmCategory);
lavChest.playAnimation();
}
}, 500);
updateBitmap应该在setComposition之后执行。因为setComposition方法会执行setImageDrawable(null) 。这将回收位图