您的位置:首页 > 编程语言 > ASP

CASpringAnimation使用和属性解析

2016-04-22 11:22 519 查看
CASpringAnimation iOS9才引入的动画类,它继承于CABaseAnimation,用于制作弹簧动画效果。

首先来看一个简单的例子,钟摆:

如果没有阻力,将一直摇摆下去,如下图:

如果是无摩擦力情况下,那么就会类似于下图的运动轨迹:

在真实的世界中,系统将由于摩擦力的存在而缺少动力并最终停止在自己的平衡点。

这种情况下,那么就会类似于下图的运动轨迹:

我们可能会注意到一个钟摆的过程,其实会涉及到很多因数。UIKit能够让我们创建一个简单的弹性动画,当我们使用UIKit的弹性动画方法时:

UIView.animateWithDuration(duration: NSTimeInterval,
delay: NSTimeInterval,
usingSpringWithDamping dampingRatio: CGFloat,
initialSpringVelocity velocity: CGFloat,
options: UIViewAnimationOptions,
animations: () -> Void,
completion: ((Bool) -> Void)?)


该方法创建弹性动画时,我们只有usingSpringWithDamping(阻尼系数)和initialSpringVelocity(弹性的初始化速度)这两个参数与弹性动画相关。UIKit在给定的时间内使系统以动态的方式调整所有的变量,UIKit的弹性动画看起来有点急促,少量的不自然。幸运的是,Core
Animation为我们提供了CASpringAnimation类创建合适的弹性动画效果,相当于渲染一个合理的物理模仿看起来效果感觉就更加真实了。

属性解析:

/** Subclass for mass-spring animations. */
public class CASpringAnimation :CABasicAnimation {

/*质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大,动画的速度变慢.默认值为1*/

public var mass:CGFloat

/*刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快。默认值为100 */

public var stiffness:CGFloat

/*阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快。默认值为10 */

public var damping:CGFloat

/*初始速率,动画视图的初始速度大小,速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反*/

public var initialVelocity:CGFloat

/* 结算时间返回弹簧动画到停止时的估算时间,根据当前的动画参数估算,通常弹簧动画的时间使用结算时间比较准确. */

public var settlingDuration:CFTimeInterval { get }
}

下面使用CASpringAnimation的一个小demo:

//实现触摸屏幕,使红色小方块移动到对应的点,并且来回上下弹性运动。最好的方式理解属性,就是改不同的值,多试试效果。
override func touchesBegan(touches:Set<UITouch>, withEvent event:UIEvent?) {
let tounch = touches.first
let tounchPoint = tounch?.locationInView(self.view)

let moveAniamtion = CASpringAnimation(keyPath: "position")
moveAniamtion.fromValue = NSValue.init(CGPoint: self.move.center)
moveAniamtion.toValue = NSValue.init(CGPoint: tounchPoint!)
moveAniamtion.damping = 5  //阻尼系数越大,停止越快
moveAniamtion.stiffness = 100 //刚度系数越大,形变产生的力就越大,运动越快
moveAniamtion.initialVelocity =0.0//速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反
moveAniamtion.mass = 1 //质量越大,弹簧拉伸和压缩的幅度越大
moveAniamtion.duration = moveAniamtion.settlingDuration

self.move.layer.addAnimation(moveAniamtion, forKey:nil)
self.move.center = tounchPoint!
}

推荐的非官方弹簧动画实现:

JNWSpringAnimation:该库还提供了一个Mac端的工具来帮助你调试动画效果,而不需要你在模拟器或是真机上不断编译、调整、编译了。
Facebook's
pop:一个强大的动画库。
RBBAnimation::官方的反编译版本,效果直追官方。
AnimationEngine:特点是像pop
一样使用 CADisplayLink 实现动画以及提供方便的Block 接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: