3

我已经通过 adobe after effects 制作了一个动画,并JSON用图像导出了文件,它可以工作,因为我已经从 assets 文件夹中放置了照片。

我想更改JSON文件中的一张图片

"assets": [
 {
  "id": "image_0",
  "w": 960,
  "h": 540,
  "u": "images/",
  "p": "img_0.png"
}

这是JSON具有 id 我不知道如何更改或更改名称或以编程方式设置图像的文件

换句话说,我想更改从我的 java 代码中选择的特定图像并放置另一个图像,例如更改衬衫图像。

4

5 回答 5

3

经过一些研究找到答案只需使用此功能

lottieAnimationView.updateBitmap("the id of the image which is found in the json file",thebitmap); 
于 2018-04-03T19:17:09.027 回答
2

经过大量研究,我发现有两种方法可以更改动画 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
于 2019-07-11T08:57:07.323 回答
0

您可以解析 json 文件,进行更改并将这些更改再次放入 json 文件中。write/update 尽管如果 json 文件存储在 assets 文件夹中,您将无法在其中执行任何 操作。

于 2018-04-03T13:19:40.530 回答
0

@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);
于 2019-11-18T07:48:41.717 回答
0

updateBitmap应该在 setComposition 之后执行。因为setComposition方法会执行 setImageDrawable(null)。这将回收位图

于 2020-10-10T08:27:24.113 回答