如何在SwiftUI中对路径进行动画处理

路易斯

不熟悉SwiftUI,也没有关于这个新框架的文档。我想知道是否有人熟悉如何Path在SwiftUI中设置动画

例如,给定一个视图,可以说这样简单RingView

struct RingView : View {   
    var body: some View {
        GeometryReader { geometry in
            Group {
                // create outer ring path
                Path { path in
                    path.addArc(center: center,
                                radius: outerRadius,
                                startAngle: Angle(degrees: 0),
                                endAngle: Angle(degrees: 360),
                                clockwise: true)
                }
                .stroke(Color.blue)

                // create inner ring
                Path { path in
                    path.addArc(center: center,
                                radius: outerRadius,
                                startAngle: Angle(degrees: 0),
                                endAngle: Angle(degrees: 180),
                                clockwise: true)
                }
                .stroke(Color.red)
                .animation(.basic(duration: 2, curve: .linear))
            }
        }
        .aspectRatio(1, contentMode: .fit)
    }
}

显示的内容是:

在此处输入图片说明

现在,我想知道如何对内圈进行动画处理,即蓝线内的红线。我想要做的动画是一个简单的动画,其中的路径从头开始出现,并遍历到结束。

使用CoreGraphics和旧的UIKit框架,这相当简单,但是似乎没有.animation(.basic(duration: 2, curve: .linear))在内部路径中添加简单内容并显示带有withAnimation的视图的功能。

我查看了SwiftUI上提供的Apple教程,但实际上它们仅涵盖了更深入的视图(例如)上的移动/缩放动画Image

关于如何为PathShape在SwiftUI中设置动画的任何指导

康提基

路径的动画在WWDC会话237(使用SwiftUI构建自定义视图)中进行了展示关键是使用AnimatableData。您可以跳到31:23,但我建议您至少在27:47分钟开始。

您还需要下载示例代码,因为方便的是,演示中未显示(也未说明)有趣的部分:https : //developer.apple.com/documentation/swiftui/drawing_and_animation/building_custom_views_in_swiftui


更多文档:自从我最初发布答案以来,我继续研究如何为Path设置动画,并发布了一篇有关Animatable协议以及如何将其与Paths一起使用的详尽解释:https : //swiftui-lab.com/swiftui- animations-part1 /


更新:

我一直在使用形状路径动画。这是GIF。

在此处输入图片说明

这是代码:

重要说明:该代码无法在Xcode Live Previews上进行动画处理。它需要在模拟器或真实设备上运行。

import SwiftUI

struct ContentView : View {
    var body: some View {
        RingSpinner().padding(20)
    }
}

struct RingSpinner : View {
    @State var pct: Double = 0.0

    var animation: Animation {
        Animation.basic(duration: 1.5).repeatForever(autoreverses: false)
    }

    var body: some View {

        GeometryReader { geometry in
            ZStack {
                Path { path in

                    path.addArc(center: CGPoint(x: geometry.size.width/2, y: geometry.size.width/2),
                                radius: geometry.size.width/2,
                                startAngle: Angle(degrees: 0),
                                endAngle: Angle(degrees: 360),
                                clockwise: true)
                }
                .stroke(Color.green, lineWidth: 40)

                InnerRing(pct: self.pct).stroke(Color.yellow, lineWidth: 20)
            }
        }
        .aspectRatio(1, contentMode: .fit)
            .padding(20)
            .onAppear() {
                withAnimation(self.animation) {
                    self.pct = 1.0
                }
        }
    }

}

struct InnerRing : Shape {
    var lagAmmount = 0.35
    var pct: Double

    func path(in rect: CGRect) -> Path {

        let end = pct * 360
        var start: Double

        if pct > (1 - lagAmmount) {
            start = 360 * (2 * pct - 1.0)
        } else if pct > lagAmmount {
            start = 360 * (pct - lagAmmount)
        } else {
            start = 0
        }

        var p = Path()

        p.addArc(center: CGPoint(x: rect.size.width/2, y: rect.size.width/2),
                 radius: rect.size.width/2,
                 startAngle: Angle(degrees: start),
                 endAngle: Angle(degrees: end),
                 clockwise: false)

        return p
    }

    var animatableData: Double {
        get { return pct }
        set { pct = newValue }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Kineticjs中对曲线路径上的对象进行动画处理

如何在Qt中对QPixmap进行动画处理?

如何在Wpf中对按钮FontSize进行动画处理?

在HTML5画布上对路径进行动画处理

如何遍历路径元素并依次对其进行动画处理?

如何使用重力沿弯曲路径进行动画处理

在BonsaiJS中沿路径对电影进行动画处理

在Konva中沿线或路径对形状进行动画处理

在圆形路径中对GMSMarker进行动画处理

如何通过SwiftUI中的状态变量对形状进行动画处理?

如何在更改URL的同时对项目进行动画处理?

SwiftUI:对List中的更改进行动画处理,而无需对内容更改进行动画处理

如何在Unity中对线渲染器平铺纹理进行动画处理

如何在Material-UI中对卡片高度进行动画处理(反应)

如何在android-studio中制作文本以进行动画处理?

如何在Vue.js2中对表单元素进行动画处理

如何在AngularJS中对ng-repeat渲染的div进行动画处理

关于如何在Tkinter中对gif进行动画处理的问题

如何在JS中以两个不同的间隔对组件进行动画处理

如何在React中的状态变化上对span元素进行动画处理?

如何在Dragcompleted中对连接到对象的线进行动画处理?

如何在Android中同时对视图进行动画处理,缩放和变形?

如何在XAML中多次对元素的宽度进行动画处理?

Swift:沿动画路径对对象进行动画处理

在Flutter中对布局进行动画处理

在UITableViewCell中对UITableView进行动画处理

在GridView中对单元进行动画处理

在JS中对insertInjacentHTML进行动画处理

在Python中对图像进行动画处理