Animation iOS 7 spring动画的时间与位置关系图方程式(动画持续时间:延迟:使用SpringWithDamping:…)
给定[UIView animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:中使用的弹簧参数: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
(我正在尝试在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
不允许大于1omega
根据持续时间
参数计算得出。如果dampingRatio==1,omega
是这样的值
abs(-1+(v0-ω)*持续时间)*exp(-ω*持续时间)==0.001
如果dampingRatio<1,omega
是这样的值
abs(c2)*exp(a*t)==0.001
其中c2
和a
在curveFunc
sho中定义