CASpringAnimation使用和属性解析

来源:互联网 发布:unity3d 室内漫游 编辑:程序博客网 时间:2024/06/05 21:01

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 接口。

0 0