在运行时动态替换Lottie动画中的Image

时间:2019-02-04 11:31:25

标签: android lottie lottie-android

我有一个超级简单的After Effects动画,其中有一个正方形移动(AE形状)。我使用Bodymovin将动画导出为.json,并在项目中使用Lottie添加json文件。到目前为止,一切都很好。

问题从这里开始->在运行时,将“正方形”替换为我在项目中拥有的图像。由于此图像可能会更改,因此我无法将其静态添加到AE动画中,因此需要在运行时动态添加。几乎没有有关如何在Android中执行此操作的信息?

3 个答案:

答案 0 :(得分:1)

Lottie具有一个XML属性app:lottie_imageAssetsFolder,也可以在运行时设置animationView.setImageAssetsFolder("images/");。有了这一组,就可以参考json中的图像。这是在线记录的;请参阅## 599和#630行上方的注释。 documentation中也对此进行了说明(src/assets不可选项,因为它不可写):

  

有时,您没有与设备捆绑在一起的图像。如果您是从网络上下载动画的,则可以这样做以节省apk的空间。要处理这种情况,您可以在ImageAssetDelegateLottieAnimationView上设置LottieDrawable。每当Lottie尝试渲染图像时,都会调用该委托。它将传递图像名称,并要求您返回位图。如果您还没有它(例如,如果仍在下载中),则只需返回null,Lottie会继续询问每一帧,直到您返回非null值。

animationView.setImageAssetDelegate(new ImageAssetDelegate() {
    @Override
    public Bitmap fetchBitmap(LottieImageAsset asset) {
        if (downloadedBitmap == null) {
            // We don't have it yet. Lottie will keep asking until we return a non-null bitmap.
           return null;
        }
        return downloadedBitmap;
    }
});

答案 1 :(得分:1)

LottieAnimationView扩展了ImageView。换句话说,LottieAnimationView也是ImageView

因此,您可以在LottieAnimationView上设置图像,就像在ImageView上设置图像一样。

例如:

if (isAnimated) {
    mLottieView.setAnimation("<json file name from asset folder>");
} else {
    mLottieView.setImageResource(R.drawable.square_image);
}

这只是一个示例,说明如何使用同一视图播放动画(json文件),而您只是像任何ImageView一样显示图像。

答案 2 :(得分:0)

设法做到这一点:问题是我的After Effects动画具有矢量形状,而我正试图替换它。在将原始动画改为.png之后,可以在运行时替换Image。工作得很好。

// First I converted the png I wanted to see at runtime to a bitmap:

Bitmap bitmapImage = BitmapFactory.decodeResource(getResources(), R.drawable.imageBlah);

// I used the lambda: 

lottieAnimationView.setImageAssetDelegate( lottieImageAsset -> bitmapImage);

这适用于一个图像,现在我要看看如何在运行时替换多个图像。