上一篇讲了
CABasicAnimation
,总结一下
1.fromValue
,toValue
,因为是基本动画,所以只有这两个属性(好像只有CABasicAnimation才有)
2.操作对象是layer
3.要执行什么动画,通过keyPath
指定
4.继承自CAPropertyAnimation
(CAKeyAnimation也继承这个)
做动画基本步骤
1.创建对象
2.设置要执行什么动画
3.设置动画的数值
4.设置执行完动画不移除的属性
5.添加动画
今天讲解一下帧动画CAKeyframeAnimation
,做动画有两种方法:
1.通过values
属性做动画
通过一个数组装有4个点做动画
//1.通过values执行动画组
private func valuesForAnimation()
{
let anim = CAKeyframeAnimation()
//0.做什么的动画
anim.keyPath = "position"
//1.点之间的移动
let value1 = NSValue.init(CGPoint: CGPointZero)
let value2 = NSValue.init(CGPoint: CGPointMake(14, 15))
let value3 = NSValue.init(CGPoint: CGPointMake(141, 115))
let value4 = NSValue.init(CGPoint: CGPointMake(404, 175))
let value5 = NSValue.init(CGPoint: CGPointMake(55, 5))
//3.设置属性
anim.values = [value1,value2,value3,value4,value5]
anim.duration = 2
//4.防止动画被移除
anim.removedOnCompletion = false
anim.fillMode = kCAFillModeForwards
//4,添加动画
gView.layer .addAnimation(anim, forKey: nil)
}
2.通过path
属性做动画
通过path执行动画
//2.通过path执行动画
private func pathForAnimation(){
//1.创建帧动画
let anim = CAKeyframeAnimation()
//2.做什么的动画
anim.keyPath = "position"
//3.创建路径,一定要释放
let path = CGPathCreateMutable()
CGPathAddEllipseInRect(path, nil, CGRectMake(100, 300, 156, 300))
anim.path = path
//防止动画消失的属性
anim.removedOnCompletion = false
anim.fillMode = kCAFillModeForwards
//设置时间属性
anim.duration = 2
//添加动画
gView.layer .addAnimation(anim, forKey: nil)
}
kCAMediaTimingFunctionEaseInEaseOut 慢进慢出要根据
path
执行动画,首先应该有path,就创建一个,但是应当执行release操作,好像这个swift中没有,我找了,没找到,但是oc中必须执行CAPathRelease操作,否则有问题
说说动画对象的
timingFunction
属性,还是刚才的代码,只是多添加了一个属性的设置和介绍
//2.通过path执行动画
private func pathForAnimation(){
//1.创建帧动画
let anim = CAKeyframeAnimation()
//2.做什么的动画
anim.keyPath = "position"
//3.创建路径,一定要释放
let path = CGPathCreateMutable()
CGPathAddEllipseInRect(path, nil, CGRectMake(100, 300, 156, 300))
anim.path = path
//防止动画消失的属性
anim.removedOnCompletion = false
anim.fillMode = kCAFillModeForwards
anim.delegate = self
//执行动画的节奏
/**
ease 是缓慢的意思
平缓匀速
public let kCAMediaTimingFunctionLinear: String
缓慢进入,其余的都是匀速
public let kCAMediaTimingFunctionEaseIn: String
缓慢移除
public let kCAMediaTimingFunctionEaseOut: String
慢慢进入慢慢出去
public let kCAMediaTimingFunctionEaseInEaseOut: String
默认
public let kCAMediaTimingFunctionDefault: String
*/
anim.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
//设置时间属性
anim.duration = 2
//添加动画
gView.layer .addAnimation(anim, forKey: nil)
}
动画的代理方法
1.不用声明什么代理就直接可以使用方法
2.必须要成为代理才执行代理的方法
//动画的代理方法,开始,结束
override func animationDidStart(anim: CAAnimation) {
print("开始")
}
override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
print("结束")
}
不解释了,不说也懂~
总结
1.帧动画操作的对象也是layer
2.帧动画可以通过values
和path
设置执行的路径
3.可以监听动画的代理方法
4.可以设置动画的进入和离开的动画模式
5.CAKeyframeAnimation
和CABasicAnimation 都继承自
CAPropertyAnimation
6.时间,速度,代理是CAAnimation
的属性,所有的动画都有,都可以使用
白送一个动画效果
苹果自带软件删除的晃动效果 @IBAction func start(sender: AnyObject) {
let anim = CAKeyframeAnimation()
//1.设置要执行啥动画
anim.keyPath = "transform.rotation"
//2.设置动画的数值
anim.values = [-15/180*M_PI,15/180*M_PI,-15/180*M_PI]
//3.设置其他属性
anim.duration = 0.9
anim.repeatCount = 100
//4.设置动画结束后保存原样
anim.removedOnCompletion = false
anim.fillMode = kCAFillModeForwards
gView.layer.addAnimation(anim, forKey: "shake")
}
@IBAction func stop(sender: AnyObject) {
gView.layer.removeAnimationForKey("shake")
}
addAnimation(anim, forKey: "shake")
中的forKey,就是给动画一个名字,删除的时候方便找到,然后删除
网友评论