CASpringAnimation使用和属性解析

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值