类
CAKeyframeAnimation->CAPropertyAnimation->CAAnimation 继承关系
CABasicAnimation->CAPropertyAnimation->CAAnimation 继承关系
示例动画(从某一点移动到另一点)
-
(CAKeyframeAnimation *)getMoveAnimation:(CGPoint)tpoint fromPoint:(CGPoint)fpoint index:(int)index {
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
// 设定动画起始帧和结束帧
animation.calculationMode = kCAAnimationPaced;
animation.fillMode = kCAFillModeForwards; //当动画结束后,layer会一直保持着动画最后的状态.
animation.removedOnCompletion = NO; //当动画结束后,是否保留显示隐性层
animation.repeatCount = 0; //重复次数,无限使用INFINITY
animation.delegate = self;
[animation setValue:@(index) forKey:@"AnimationViewIndex"];float d = sqrtf ((fpoint.x-tpoint.x)(fpoint.x-tpoint.x)+(fpoint.y-tpoint.y)(fpoint.y-tpoint.y));
animation.duration = d/500; //所用时间CGMutablePathRef curvedPath = CGPathCreateMutable();
CGPathMoveToPoint(curvedPath, 0, fpoint.x, fpoint.y);
CGPathAddLineToPoint(curvedPath, 0, tpoint.x, tpoint.y);
animation.path = curvedPath;
CGPathRelease(curvedPath);return animation;
}
caleculatuinMode:
kCAAnimationLinear calculationMode的默认值,表示当关键帧为座标点的时候,关键帧之间直接直线相连进行插值计算;
kCAAnimationDiscrete 离散的,就是不进行插值计算,所有关键帧直接逐个进行显示;
kCAAnimationPaced 使得动画均匀进行,而不是按keyTimes设置的或者按关键帧平分时间,此时keyTimes和timingFunctions无效;
kCAAnimationCubic 对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算,这里的主要目的是使得运行的轨迹变得圆滑;
kCAAnimationCubicPaced 看这个名字就知道和kCAAnimationCubic有一定联系,其实就是在kCAAnimationCubic的基础上使得动画运行变得均匀,就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的.
fillMode:
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
.
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态.
kCAFillModeBackwards 在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始. 你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状