Animation iOS 7 spring动画的时间与位置关系图方程式(动画持续时间:延迟:使用SpringWithDamping:…)

Animation iOS 7 spring动画的时间与位置关系图方程式(动画持续时间:延迟:使用SpringWithDamping:…),animation,ios7,uiviewanimation,equation,uiviewanimation-curve,Animation,Ios7,Uiviewanimation,Equation,Uiviewanimation Curve,给定[UIView animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:中使用的弹簧参数: 使用带阻尼的弹簧 初始速度 时间与位置关系图的数学方程是什么 (我正在尝试在iOS 7中使用新的spring动画API,但效果不佳,而且实验耗时太长。我的目标是尽可能接近一些动画曲线,如果我使用核心动画而不是UIView的块对象动画,我会使用CAMediaT

给定[UIView animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:中使用的弹簧参数:

  • 使用带阻尼的弹簧
  • 初始速度
  • 时间与位置关系图的数学方程是什么


    (我正在尝试在iOS 7中使用新的spring动画API,但效果不佳,而且实验耗时太长。我的目标是尽可能接近一些动画曲线,如果我使用核心动画而不是UIView的块对象动画,我会使用CAMediaTimingFunction指定这些曲线。)

    我相信得出的数学方程就是这里描述的:

    阻尼参数对应于阻尼比ζ,ζ=1导致所谓的临界阻尼弹簧,该弹簧在不发生振荡的情况下尽可能快地收敛到最终位置。 当初始速度为零时,它对应于类似于缓进缓出曲线的东西,但缓进部分更陡峭,缓出部分更平滑

    阻尼比大于1时,动画将看起来更线性。 对于阻尼比,最终位置附近将出现小于一个的振荡。它的频率可以从动画持续时间和其他参数中得到

    这是关于初始速度的说法,应该很清楚:

    弹簧的初始速度。要使动画平滑开始,请将此值与附着之前的视图速度相匹配。 值1对应于在一秒钟内穿过的总动画距离。例如,如果总动画距离为200点,并且希望动画的起点与100 pt/s的视图速度相匹配,请使用值0.5


    DampingRatio

    弹簧动画接近静止状态时的阻尼比

    若要在不发生振荡的情况下平滑减速动画,请使用值1。采用接近零的阻尼比来增加振荡

    当阻尼值接近0.0时,弹簧将变得更具弹性

    速度

    弹簧的初始速度。要使动画平滑开始,请将此值与附着之前的视图速度相匹配

    初始弹簧速度的值为1.0对应于在一秒钟内穿过的总动画距离。例如,如果总动画距离为200点,并且希望动画的起点与100 pt/s的视图速度相匹配,请使用值0.5

    例如:

    [UIView animateWithDuration:2.0
                          delay:0.0
         usingSpringWithDamping:0.4
          initialSpringVelocity:0.5
                        options:(UIViewAnimationOptions)options
                     animations:^{
    
                     }
                    completion:nil];
    

    iOS中主要有四种spring API:

    • SwiftUI动画.spring(响应:阻尼分数:blendDuration:)
    • SwiftUI动画。插值弹簧(质量:刚度:阻尼:初始速度:)
    • UIView.animate(withDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:)
    • CASpringAnimation(具有4个物理特性:质量、刚度、阻尼和初始速度)
    它们基于相同的物理过程,因此具有相同的基本方程,可以写成

    func curveFunc(_ t: Double) -> Double {
        let v0 = initialVelocity
        let zeta = dampingRatio
    
        let y: Double
        if abs(zeta - 1.0) < 1e-8 {
            let c1 = -1.0
            let c2 = v0 - omega
            y = (c1 + c2 * t) * exp(-omega * t)
        } else if zeta > 1 {
            let s1 = omega * (-zeta + sqrt(zeta * zeta - 1))
            let s2 = omega * (-zeta - sqrt(zeta * zeta - 1))
            let c1 = (-s2 - v0) / (s2 - s1)
            let c2 = (s1 + v0) / (s2 - s1)
            y = c1 * exp(s1 * t) + c2 * exp(s2 * t)
        } else {
            let a = -omega * zeta
            let b = omega * sqrt(1 - zeta * zeta)
            let c2 = (v0 + a) / b
            let theta = atan(c2)
            // Alternatively y = (-cos(b * t) + c2 * sin(b * t)) * exp(a * t)
            y = sqrt(1 + c2 * c2) * exp(a * t) * cos(b * t + theta + Double.pi)
        }
    
        return y + 1
    }
    
    func curveFunc(\ut:Double)->Double{
    设v0=初始速度
    让zeta=dampingRatio
    让y:加倍
    如果abs(zeta-1.0)<1e-8{
    设c1=-1.0
    设c2=v0-ω
    y=(c1+c2*t)*exp(-ω*t)
    }否则,如果zeta>1{
    设s1=ω*(-zeta+sqrt(zeta*zeta-1))
    设s2=ω*(-zeta-sqrt(zeta*zeta-1))
    设c1=(-s2-v0)/(s2-s1)
    设c2=(s1+v0)/(s2-s1)
    y=c1*exp(s1*t)+c2*exp(s2*t)
    }否则{
    设a=-omega*zeta
    设b=ω*sqrt(1-zeta*zeta)
    设c2=(v0+a)/b
    设θ=atan(c2)
    //或者y=(-cos(b*t)+c2*sin(b*t))*exp(a*t)
    y=sqrt(1+c2*c2)*exp(a*t)*cos(b*t+theta+Double.pi)
    }
    返回y+1
    }
    
    有三个参数:
    initialVelocity
    dampingRatio
    omega
    dampingRatio
    确定曲线的形状,当
    dampingRatio
    为0时,它是无阻尼谐振子,较大的
    dampingRatio
    意味着较大的摩擦力。使用SwiftUI Animation.spring,您可以使用其他三个API获得大于1的
    dampingRatio
    omega
    是角频率,如果没有阻尼,较大的
    omega
    意味着更快的振荡

    t
    是以秒为单位的时间。此函数的返回值是相对的:0表示动画的起点,1表示动画的终点<代码>初始速度也是相对的。值1对应于在一秒钟内穿过的总动画距离

    四种不同的API有不同的方法来确定这三个参数

    (1) 在Animation.spring API中

    ω=2*π/响应

    初始速度=0

    阻尼只是阻尼分数

    (2) 在Animation.interpolingspring API中

    ω=sqrt(刚度/质量)

    阻尼=最小值(1.0,阻尼/2/sqrt(刚度*质量))

    (3) 在UIView.animate API中,
    dampingRatio
    initialVelocity
    仅在API的参数中,但
    dampingRatio
    不允许大于1
    omega
    根据
    持续时间
    参数计算得出。如果dampingRatio==1,
    omega
    是这样的值

    abs(-1+(v0-ω)*持续时间)*exp(-ω*持续时间)==0.001

    如果dampingRatio<1,
    omega
    是这样的值

    abs(c2)*exp(a*t)==0.001

    其中
    c2
    a
    curveFunc
    sho中定义