如何更改lottie json文件中的单个图像

时间:2018-04-03 13:00:59

标签: android lottie lottie-android

我在adobe后制作了一个动画效果并导出了JSON文件和图像,但是它可以正常工作

因为我已经从资产文件夹中放了照片

问题 我想更改JSON文件中的一个图像

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

这是JSON文件的一部分,其ID不知道如何更改或更改名称或以编程方式设置图像

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

5 个答案:

答案 0 :(得分:2)

在一些研究后发现答案只是使用这个功能

lottieAnimationView.updateBitmap("the id of the image which is found in the json file",thebitmap); 

答案 1 :(得分:1)

经过大量研究,我发现有两种方法可以更改乐天json动画中的图像。

1)正如@Nour Ahmed所说,updateBitmap()是正确的方法。但是,有一个微妙的提醒,您必须确保LottieAnimationView完全膨胀且可见。通常情况下,您在onCreate()中更新了图像,但它不起作用。因此,您可以花一些时间来延迟几毫秒:

// Bug Lottie @@.
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);

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需要完全可见。

答案 2 :(得分:0)

您可以解析json文件,进行更改并将这些更改再次放入json文件中。虽然你将无法做任何事情 write/update  在你的json文件中,如果它存储在assets文件夹中。

答案 3 :(得分: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);

答案 4 :(得分:0)

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