SwiftUI 动画

所属分类:ios | 发布于 2024-12-14

在SwiftUI中,实现一个动画需要三个要素:

  • 一个时序曲线算法
  • 将状态(特定依赖性)同该时序曲线相关联的声明
  • 一个依赖于该状态(特定依赖性)的可动画部件

隐式动画.animation(_:, value:)

隐式动画modifier定义:

// modifier 1
func animation<V>(_ animation: Animation?, value: V) -> some View where V : Equatable

// modifier 2
func animation<V>(_ animation: Animation?, @ViewBuilder body: (PlaceholderContentView<Self>) -> V) -> some View where V : View

隐式动画示例:

struct ImplicitAnimation: View {
    @State var isAnimated: Bool = false
    var body: some View {
        RoundedRectangle(cornerRadius: isAnimated ? 50 : 25)
            .fill(isAnimated ? Color.red : Color.green)
            .frame(
                width: isAnimated ? 100 : 300,
                height: isAnimated ? 100 : 300
            )
            .rotationEffect(Angle(degrees: isAnimated ? 360 : 0))
            .offset(y: isAnimated ? -200 : 0)
            .animation(
                .linear(duration: 1).repeatForever(autoreverses: true),
                value: isAnimated
            )
            .onTapGesture {
                isAnimated.toggle()
            }
    }
}

 

显式动画withAnimation()

withAnimation()是一个函数,在函数体的闭包里来改变状态值

函数定义:

func withAnimation<Result>(_ animation: Animation? = .default, _ body: () throws -> Result) rethrows -> Result

函数的第一个参数是动画类型,默认是default

函数的第二个参数是一个闭包,在闭包函数体内进行状态的改变

显式动画示例:

struct ExplicitAnimation: View {
    @State var isAnimated: Bool = false
    var body: some View {
        RoundedRectangle(cornerRadius: isAnimated ? 50 : 25)
            .fill(isAnimated ? Color.red : Color.green)
            .frame(
                width: isAnimated ? 100 : 300,
                height: isAnimated ? 100 : 300
            )
            .rotationEffect(Angle(degrees: isAnimated ? 360 : 0))
            .offset(y: isAnimated ? -200 : 0)
            .onTapGesture {
                withAnimation(Animation
                    .linear(duration: 1)
                    .repeatForever(autoreverses: true)) {
                        isAnimated.toggle()
                    }
            }
    }
}

 

SwiftUI内置动画

1、default:默认动画,系统根据情况选择合适的动画类型。

2、linear:线性动画,以恒定速度进行动画过渡。

3、easeIn:缓慢开始的动画,逐渐加速。

4、easeOut:缓慢结束的动画,逐渐减速。

5、easeInOut:缓慢开始和结束的动画,先加速后减速。

6、easeInOut(duration: Double):缓慢开始和结束的动画,可以指定持续时间。

7、spring:弹簧动画,具有弹性效果

 

 

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接