一个LottieAnimationView中的动画序列/链接

时间:2019-07-19 05:24:22

标签: android lottie-android

我收到了多个应使用Lottie库按顺序播放的动画文件

我目前正在尝试重用相同的LottieAnimationView,并在第一个动画完成时设置下一个动画。代码如下:

private fun playFirstAnimation() {
    binding.animation.setAnimation(R.raw.progress_1)
    binding.animation.repeatCount = 2
    binding.animation.addAnimatorListener(object : Animator.AnimatorListener {
        override fun onAnimationRepeat(animation: Animator?) = Unit
        override fun onAnimationCancel(animation: Animator?) = Unit
        override fun onAnimationStart(animation: Animator?) = Unit

        override fun onAnimationEnd(animation: Animator?) {
            binding.animation.removeAnimatorListener(this)
            notifyFirstAnimationFinished()
            playSecondAnimation()
        }
    })
    binding.animation.playAnimation()
}

private fun playSecondAnimation() {
    binding.animation.setAnimation(R.raw.progress_2)
    binding.animation.repeatCount = 0
    binding.animation.addAnimatorListener(object : Animator.AnimatorListener {
        override fun onAnimationRepeat(animation: Animator?) = Unit
        override fun onAnimationCancel(animation: Animator?) = Unit
        override fun onAnimationStart(animation: Animator?) = Unit

        override fun onAnimationEnd(animation: Animator?) {
            binding.animation.removeAnimatorListener(this)
            notifySecondAnimationFinished()
            playThirdAnimation()
        }
    })
    binding.animation.playAnimation()
}

这里的问题(除了难看的代码)是短时间更改动画时出现小的闪烁(动画消失了,动画的位置没有任何显示)。 我无法将所有动画合并为一个,因为我需要知道何时恰好完成一个动画。而且我真的不想为每个动画创建单独的LottieAnimationView并在每次更改时替换它们,因为我可能会有很多动画。

在这种情况下我有什么选择?

2 个答案:

答案 0 :(得分:0)

问题在于,动画结束后,您正尝试加载另一个资源到相同的View,这是一个繁琐的过程,并同时播放动画。一种令人毛骨悚然的解决方案是增加延迟。

lottieView.setAnimation("firstlottie.json");
lottieView.playAnimation();
lottieView.addAnimatorListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {

        }

        @Override
        public void onAnimationEnd(Animator animator) {
            //first animation has ended
            lottieView.pauseAnimation();
            lottieView.setAnimation("secondlottie.json"); //will show only the first frame

            new Handler().postDelayed(new Runnable() {
                 @Override
                 public void run() {
                      lottieView.playAnimation();
                }
             }, 500);
        }

        @Override
        public void onAnimationCancel(Animator animator) {

        }

        @Override
        public void onAnimationRepeat(Animator animator) {

        }
    });

答案 1 :(得分:0)

结果证明,有一个解决此问题的简单方法。 除了调用 setAnimation 外,我们还可以调用 setComposition 并从 LottieCompositionFactory.fromRawResSync LottieCompositionFactory.fromRawRes 或任何其他方法提供预加载的结果其他适合您需求的方法。