繁体   English   中英

Lottie Animation:停止循环,但等到 animation 完成

[英]Lottie Animation: Stop Loop but wait until animation has finished

我目前正在使用 Lottie 在 Swift 中为具有不同动画的按钮制作动画。

我需要的是一种停止循环的方法,但只有当 animation 到达终点并会重复自身时。 在那一刻,我希望能够加入并用另一个非循环的 animation 替换,这样它看起来就像从循环的 animation 到另一个的流畅过渡。 这样做的原因是,我在循环 animation 时等待通过网络获取数据的完成。

它以相反的方式进入循环 animation,如下所示:

func animate(animation: Animation?, endIn loop: Animation?) {
    self.setImage(nil, for: .normal)
    self.animationView.isHidden = false
    self.animationView.animation = animation
    self.animationView.loopMode = .playOnce
    self.animationView.play { _ in
        self.animationView.animation = loop
        self.animationView.loopMode = .loop
        self.animationView.play()
    }
}

也许其他人已经实现了这种转换,我将不胜感激。

编辑:我尝试过这种方式,然后在获取完成时调用self.animationView.loopMode =.playOnce

func animate(startAnimation: Animation?,
             transitionTo loop: Animation?,
             endAnimation: Animation?,
             image: UIImage?) {
    self.setImage(nil, for: .normal)
    self.animationView.isHidden = false
    self.animationView.animation = startAnimation
    self.animationView.loopMode = .playOnce
    self.animationView.play { _ in
        self.animationView.animation = loop
        self.animationView.loopMode = .loop
        self.animationView.play { _ in
            self.animationView.animation = endAnimation
            self.animationView.loopMode = .playOnce
            self.setImage(image, for: .normal)
        }
    }
}

编辑2:

我通过上层 function 开始循环,然后调用它来结束它,找到了一个有效但不好的解决方案:

func stopLoopAndTranstion(to animation: Animation?, endIn image: UIImage?) {
    guard let animation = animation else {
        return
    }

    if self.animationView.realtimeAnimationProgress > 0.95 {
        self.animationView.stop()
        self.animationView.animation = animation
        self.animationView.loopMode = .playOnce
        self.animationView.play()
    } else {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
            self.stopLoopAndTranstion(to: animation, endIn: image)
        }
    }
}

我在这里做的是检查动画进度,一旦达到一定的进度,我就会停止并更换 animation。 我宁愿认为这是一个 hack 而不是解决方案。 每次我触发这个 function 时,CPU 使用率都会上升 2-3%,直到 animation 被替换。 虽然这 2-3% 可以忽略不计,但我还不满意,我仍在寻找一种更清洁的方法来实现这样的目标。

您可以使用Lottie提供的play(fromProgress...) API 之一

animationView.play(
    fromProgress: animationView.currentProgress,
    toProgress: 1,
    loopMode: .playOnce,
    completion: { [weak self] completed in
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
            self.stopLoopAndTranstion(to: animation, endIn: image)
        }
    }
)

这将确保您当前的动画将完成,并且在completion块中您可以完成您的收尾工作

也许您只需将重复计数设置为 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM