在完全自动反转重复周期之间延迟 SwiftUI 中的重复动画

2024-04-25

我正在 SwiftUI 中构建一个 Apple Watch 应用,它可以读取用户的心率并将其显示在心形符号旁边。

我有一个动画可以让心形符号反复跳动。由于我知道实际用户的心率,因此我希望使其以与用户心率相同的速率跳动,并在每次速率变化时更新动画。

我可以通过将心率除以 60 来确定节拍之间应间隔多少秒。例如,如果用户的心率为 80 BPM,则动画应每 0.75 秒 (60/80) 发生一次。

这是我现在拥有的示例代码,其中currentBPM是一个常量,但通常会更新。

struct SimpleBeatingView: View {
    
    // Once I get it working, this will come from a @Published Int that gets updated any time a new reading is avaliable.
    let currentBPM: Int = 80
    
    @State private var isBeating = false
    
    private let maxScale: CGFloat = 0.8
    
    var beatingAnimation: Animation {
        
        // The length of one beat
        let beatLength = 60 / Double(currentBPM)
        
        return Animation
            .easeInOut(duration: beatLength)
            .repeatForever()
    }
    
    var body: some View {
        Image(systemName: "heart.fill")
            .font(.largeTitle)
            .foregroundColor(.red)
            .scaleEffect(isBeating ? 1 : maxScale)
            .animation(beatingAnimation)
            .onAppear {
                self.isBeating = true
            }
    }
}

我希望让这个动画表现得更像苹果的内置心率应用程序。我不想让心脏不断变大或变小,而是想要拥有它beat(两个方向的动画)然后暂停一会儿beating再次(两个方向的动画)然后再次暂停,依此类推。

例如,当我添加一秒延迟时.delay(1) before .repeatForever(),动画暂停中途每个节拍。例如,它变小,暂停,然后变大,然后暂停,等等。

我明白为什么会发生这种情况,但是我怎样才能插入延迟between每个自动反转重复而不是在自动反转重复的两端?

我相信我可以算出延迟应该多长时间以及每个节拍的长度的数学计算,以使一切正常工作,因此延迟长度可以是任意的,但我正在寻找的是帮助如何在动画循环之间实现暂停.

我使用的一种方法是flatMap the currentBPM重复发表Timer每次我获得新的心率 BPM 时,我都可以尝试从中驱动动画,但我不确定如何将其实际转换为 SwiftUI 中的动画,并且我不确定以这种方式手动驱动值是否有效根据我目前对 SwiftUI 的理解,当时间似乎应该由动画处理时,正确的方法是。


一个可能的解决方案是链接单个pieces动画使用DispatchQueue.main.asyncAfter。这使您可以控制何时延迟特定部分。

这是一个演示:

struct SimpleBeatingView: View {
    @State private var isBeating = false
    @State private var heartState: HeartState = .normal

    @State private var beatLength: TimeInterval = 1
    @State private var beatDelay: TimeInterval = 3

    var body: some View {
        VStack {
            Image(systemName: "heart.fill")
                .imageScale(.large)
                .font(.largeTitle)
                .foregroundColor(.red)
                .scaleEffect(heartState.scale)
            Button("isBeating: \(String(isBeating))") {
                isBeating.toggle()
            }
            HStack {
                Text("beatLength")
                Slider(value: $beatLength, in: 0.25...2)
            }
            HStack {
                Text("beatDelay")
                Slider(value: $beatDelay, in: 0...5)
            }
        }
        .onChange(of: isBeating) { isBeating in
            if isBeating {
                startAnimation()
            } else {
                stopAnimation()
            }
        }
    }
}
private extension SimpleBeatingView {
    func startAnimation() {
        isBeating = true
        withAnimation(Animation.linear(duration: beatLength * 0.25)) {
            heartState = .large
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + beatLength * 0.25) {
            withAnimation(Animation.linear(duration: beatLength * 0.5)) {
                heartState = .small
            }
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + beatLength * 0.75) {
            withAnimation(Animation.linear(duration: beatLength * 0.25)) {
                heartState = .normal
            }
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + beatLength + beatDelay) {
            withAnimation {
                if isBeating {
                    startAnimation()
                }
            }
        }
    }

    func stopAnimation() {
        isBeating = false
    }
}
enum HeartState {
    case small, normal, large

    var scale: CGFloat {
        switch self {
        case .small: return 0.5
        case .normal: return 0.75
        case .large: return 1
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在完全自动反转重复周期之间延迟 SwiftUI 中的重复动画 的相关文章

随机推荐

  • 从 Visual Studio 搜索中排除特定文件

    是否可以从 Visual Studio 中的搜索中排除某些文件 例如 jquery js 几乎总是污染我的搜索结果 一半结果来自该文件 我知道您可以将特定类型列入白名单 但是当我想在 js 扩展名中搜索时 有解决方案吗 在这里投票功能 ht
  • 有没有办法使用 Paramiko 和 Python 来获取您连接的 SSH 服务器的横幅?

    有没有办法使用 Paramiko 和 Python 来获取您尝试连接的 SSH 服务器的横幅 我正在处理许多机器的超安全服务器设置过程 密码是通过预定义的密钥生成的 该密钥与 SSH 横幅一起打印出来 我可以访问将为我提供密码的实用程序 但
  • babeljs 无法正确转换扩展类[重复]

    这个问题在这里已经有答案了 我从这里得到了这个示例代码MDN https developer mozilla org en US docs Web JavaScript Reference Classes extends 稍微修改一下打印结
  • Windows 上的 MariaDB - 入门帮助?

    我正在尝试学习 MariaDB v5 2 4 但遇到了一些问题 我可以下载并安装它 但它似乎没有运行或者我丢失了一些东西 我正在为在 Windows 上运行的第一个计时器寻找一个好的资源 几个具体问题 是否需要 MySQL 才能运行 很多安
  • 有没有一个Java解析器可以解析这样的地址[重复]

    这个问题在这里已经有答案了 我正在使用 Java 6 我正在寻找一种自动解析地址的方法 我不关心地址是否存在 我发现的最好的东西是 JGeocoder v 0 4 1 但 JGeocoder 无法解析这样的地址 16th Street Th
  • 材质2调色板对比色

    在调色板中 我可以看到对比 如何选择对比色 works scss mat color button primary 不工作 scss mat color button primary contrast 900 看到底部写着对比 scss m
  • 如何在 PHP 中检测、删除和重定向末尾带有 # 的 url?

    客户要求我自动将任何带有井号的网址重定向到不带井号的版本 但我认为我没有使用此公式在任何网址中检测到 我使用 curPageURL 公式通过电子邮件给自己发送了一个示例 URL 它在我正在测试的 URL 中不包含尾随 符号 function
  • 在创建命名文件夹之前检查其是否存在

    我正在尝试将 Google Drive 中的特定文件插入到文件夹中 我还想检查是否有一个具有名称的文件夹 testFolder 如果是 则将文件插入到已存在的文件夹中 否则创建一个名为 testFolder 这是我到目前为止所想到的 但它总
  • 检测windows上的核心数

    如果我在 Linux 或 Mac 上运行 R 我可以使用以下命令检测可用内核的数量multicore detectCores 但是 没有 Windows 版本的多核功能 因此我无法在 Windows 上使用此技术 如何从 R 中以编程方式检
  • 从 Perl 守护程序运行时,为什么 FFMpeg 在五秒后停止?

    我用 Perl 编写了一个小守护程序 它调用 FFMpeg 对视频进行编码 但编码在 5 秒左右后停止 我用这段代码来启动它 my t echo ffmpeg command gt gt self gt FFMPEG OUTPUT my l
  • 在 flutter 应用程序中实现轮廓文本字段输入和标签文本

    我想要一个带有边框的文本字段输入 边框内有标签 如下图所示 先感谢您 我想你想要实现这样的目标 Inactive Active Validation 您可以使用此小部件来实现此设计 class OutlineBorderTextFormFi
  • y -= m < 3 是什么意思?

    在查看一些示例 C 代码时 我发现了这一点 y m lt 3 这是做什么的 它是某种压缩的 for 循环之类的吗 据我所知 用谷歌搜索是不可能的 m lt 3或者是1 or 0 取决于真值 So y y 1 when m lt 3 is t
  • golang - 省略 json 属性进行序列化的优雅方法

    我有一个用户结构 其中包含密码等敏感字段 type User struct UID string json uid binding required Password string json password binding require
  • T-SQL-在单个查询中包含计数总和(*)

    使用表 i 以及字段 date entered 和 code 我编写了一个查询来列出每年 code 12A 的计数 select distinct year date entered as Yr count as Cnt from i wh
  • 如何使用 JavaScript 四舍五入到任意数量的有效数字?

    我尝试了下面的示例代码 function sigFigs n sig if n 0 return 0 var mult Math pow 10 sig Math floor Math log n lt 0 n n Math LN10 1 r
  • 在 Converter 中将 JSF 日历日期转换为 JodaTime

    JodaTime 可能是最好的日期和时间库 因此 我很想从后台 bean 的 JodaTime 实例中的前端 xhtml Calendar 小部件接收用户输入 因此我正在考虑使用 JSF Converter 来完成这项工作 这样做明智吗 同
  • 在node.js 中创建链式方法?

    是否可以在 Node js 中创建像这样的异步链式方法 File create file jpg rename renamed jpg append Hello World 也就是说非阻塞 你基本上想要abstractAPI 上的文件处理操
  • ShapeDrawable 中的偏移形状

    我正在尝试使用扩展 ShapeDrawable 的类来绘制一个带有边框的圆角矩形 请参阅here https stackoverflow com questions 2145131 trying to draw a button how t
  • 有没有基于bootstrap的可视化网页编辑器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在完全自动反转重复周期之间延迟 SwiftUI 中的重复动画

    我正在 SwiftUI 中构建一个 Apple Watch 应用 它可以读取用户的心率并将其显示在心形符号旁边 我有一个动画可以让心形符号反复跳动 由于我知道实际用户的心率 因此我希望使其以与用户心率相同的速率跳动 并在每次速率变化时更新动