延迟动画而不是使用计时器
Posted
技术标签:
【中文标题】延迟动画而不是使用计时器【英文标题】:Animation with delay instead of using timer 【发布时间】:2020-04-25 13:39:19 【问题描述】:我在 swiftui 中有几个圈子,它们会对触摸手势做出反应。 我希望他们增加 opac 值,然后再减少它:
HStack
Spacer(minLength: 20.0)
Circle()
//#e74c3c
.foregroundColor(Color(red: 231.0/255.0, green: 76.0/255.0, blue: 60.0/255.0, opacity: buttonOpac[buttonColor.red.rawValue]))
.gesture(TapGesture()
.onEnded(if self.buttonActive
self.buttonActive = false
self.blink(buttonColor.red)
else
print("button inactive")
)) ...
方法blink动画opac值的变化:
func blink(_ buttonCol: buttonColor)
self.currentNumber += 1
withAnimation(.easeOut(duration: blinkDuration))
self.buttonOpac[buttonCol.rawValue] = 1.0
withAnimation(Animation.easeIn(duration: blinkDuration).delay(blinkDuration))
self.buttonOpac[buttonCol.rawValue] = 0.5
withAnimation(Animation.linear.delay(2 * blinkDuration))
self.buttonActive = true
在此动画处于活动状态时,我希望禁用圆圈并且不对触摸做出反应。我会尝试通过@Status var buttonActive 来达到这个目的
这仅适用于在进入 .onEnded 块时将此值设置为 false。现在我想在其他动画结束后用眨眼方法重置它。但是延迟修饰符不适用于第三个“动画”。事实上,该值会立即设置回 true,以便圆圈继续对触摸做出反应。
不使用计时器是实现目标的唯一方法吗?
【问题讨论】:
能否给我们 buttonOpac、buttonColor、currentNumber 和 blinkDuration 的声明? 您可以使用与我在how to do a simple scaling animation and why isn't this working?中进行缩放相同的解决方案 @Asperi 感谢您的缩放解决方案。为了更好地理解它是如何工作的,我必须理解动画的概念,这在 (swiftui-lab.com/swiftui-animations-part1) 中有很好的解释。结合理论,您的解决方案很容易理解,并且完全符合我的要求。 【参考方案1】:以下是声明:
enum buttonColor: Int
case red
case blue
case green
case yellow
let blinkDuration = 0.5
@State private var buttonOpac: [Double] = [0.5, 0.5, 0.5, 0.5]
@State private var currentNumber = 0
【讨论】:
以上是关于延迟动画而不是使用计时器的主要内容,如果未能解决你的问题,请参考以下文章
启用外设定时器和定时器实际开始计数之间是不是有延迟?这是啥延迟,是啥原因造成的?