简单动画 (三)

2017-09-19  本文已影响7人  进阶的蚊子

     紧接着上一讲,我们今天完成常见简单动画的另外2 部分----- CAKeyframeAnimation以及CAAnimationGroup

首先我们先总结一下: 我们添加动画 都是添加到layer 上的 方法是

[self.view.layer  addAniamtionForKey:@"   "];

而我们创建动画一般要设置keyPath 

CAKeyframeAnimation* ani=[CAKeyframeAnimation animationWithKeyPath:@"position"];

我们常见的和动画相关的  keyPath 有如下列表

transform.rotation.x          围绕x轴翻转。y,z同理 参数:角度

transform.rotation             默认围绕z轴

transform.scale.x               x方向缩放。y,z同理

transform.scale                  所有方向缩放

transform.translation.x      x轴方向移动,参数:x轴上的坐标。y,z同理

transform.translation       移动到的点

zPosition                          平面的位置

opacity                              透明度

backgroundColor            背景颜色 参数:颜色 (id)[[UIColor redColor] CGColor]

cornerRadius                    layer圆角

borderWidth                     边框宽度

bounds                             大小 参数:CGRect

contents                          内容 参数:CGImage

contentsRect                 可视内容 参数:CGRect 值是0~1之间的小数

position                           位置,效果和transform.rotation差不多

shadowColor                  阴影颜色

shadowOffset                阴影偏移

shadowOpacity              阴影透明度

shadowRadius               阴影角度

一   CAKeyframeAnimation 动画的实现

先简单解读主要的几个常用属性

@interface CAKeyframeAnimation : CAPropertyAnimation

@property(nullable, copy) NSArray *values;

@property(nullable) CGPathRef path;

@property(nullable, copy) NSArray*keyTimes;

@property(nullable, copy) NSArray*timingFunctions;

values      NSArray对象,里面的元素称为”关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧

path     可以设置一个CGPathRef\CGMutablePathRef,让层跟着路径移动。path只对CALayer的anchorPoint和position起作用。如果你设置了path,那么values将被忽略

keyTimes    可以为对应的关键帧指定对应的时间点,其取值范围为[0,1],keyTimes中的每一个时间值都对应values中的每一帧.当keyTimes没有设置的时候,各个关键帧的时间是平分的

    1  values方式实现

先上代码  

#pragma mark  value 实现

-(void)animationsWithValues

{

CAKeyframeAnimation* ani=[CAKeyframeAnimation animationWithKeyPath:@"position"];

CGFloat px=80;

CGFloat py=80;

NSValue* val1=[NSValue valueWithCGPoint:CGPointMake(px, py)];

NSValue* val2 =[NSValue valueWithCGPoint:CGPointMake(kScreeenWidth-px, py)];

NSValue * val3=[NSValue valueWithCGPoint:CGPointMake(kScreeenWidth-px, kScreeenHeight-py)];

NSValue* val4=[NSValue valueWithCGPoint:CGPointMake(px, kScreeenHeight-py)];

NSValue* val5=val1;

//位置

ani.values=@[val1,val2,val3,val4,val5];

//重复次数

ani.repeatCount=1000;

//完成后是否移除

ani.removedOnCompletion=NO;

ani.fillMode=kCAFillModeForwards;

//动画执行时间

ani.duration=4.0;

ani.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

[self.keyButton.layer addAnimation:ani forKey:@"values"];

}

效果图

2  path 方式实现

#pragma mark  path 方式实现

-(void)keyFrameAnimationWithPath

{

CAKeyframeAnimation* ani=[CAKeyframeAnimation animationWithKeyPath:@"position"];

//绘图

CGMutablePathRef  path=CGPathCreateMutable();

//路线rect  和 path

CGFloat px=80;

CGFloat py=80;

//调用CGPathde 方法

CGPathAddRect(path, NULL, CGRectMake(px, py, kScreeenWidth-2*px, kScreeenHeight-2*py));

ani.path=path;

CGPathRelease(path);

ani.repeatCount=1000;

ani.removedOnCompletion=NO;

ani.fillMode=kCAFillModeForwards;

ani.duration=8.0;

ani.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

[self.keyButton.layer addAnimation:ani forKey:@"path"];

}

效果图

3  keyTimes 实现

pragma mark  keyTimes 实现

-(void)keyFrameAniamtionWithKeyTimes

{

CAKeyframeAnimation* animation=[CAKeyframeAnimation animationWithKeyPath:@"position.x"];

//animation.keyPath=@"transform.translation.x";

animation.values=@[@10,@100, @(-100),@100,@0];

//关键帧指定对应的时间点

animation.keyTimes=@[@0 ,@(1/6),@(3/6),@(5/6),@(1)];

animation.duration=6;

animation.additive=YES;

animation.repeatCount=1000;

[self.keyButton.layer addAnimation:animation forKey:@"keyTimes"];

}

2   CAAnimationGroup

简单的理解就是动画组合,也就是一次执行多个动画

#pragma mark  动画组合

-(void)animationGroup

{

//动画1 旋转

CABasicAnimation* animation1=[CABasicAnimation animationWithKeyPath:@"transform.rotation"];

animation1.toValue=@(M_PI/2);

//缩放动画

CABasicAnimation* aniamtion2=[CABasicAnimation animationWithKeyPath:@"transform.scale"];

aniamtion2.toValue=@(2);

//创建动画组

CAAnimationGroup* group=[[CAAnimationGroup alloc]init];

group.duration=4;

group.fillMode=kCAFillModeForwards;

group.repeatCount=1000;

group.removedOnCompletion=NO;

group.animations=@[animation1,aniamtion2];

[self.keyButton.layer addAnimation:group forKey:nil];

}

动画效果

几种简单的动画就介绍完了,以后有更多发现楼主会更新的,另外推荐一款录制动画gif的利器LICEcap,录制gif灰常好用 ,实在是程序员展现动画的必备神器.....

上一篇下一篇

猜你喜欢

热点阅读