如何更改 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。

  1. 正如@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);
    
  2. 第二种方法是使用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) 。这将回收位图