几种特殊的layer动画

iOS的CoreAnimation框架下有一些特殊的layer,使用它们往往会做出非常炫丽的动画效果,不需要使用图片,不需要帧动画。下面我们就来看看三种常见的layer动画,分别是CAReplicatorLayer、CAEmitterLayer和CAGradientLayer。

一、复制层动画 CAReplicatorLayer

CAReplicatorLayer可以复制自己子层的layer,并且复制的出来的layer和原来的子layer拥有相同的动效。然后通过设置一些属性,就可以完成很酷的效果,非常强大。。

##效果1:

##实现:
1.首先我们要得到一个love路径,这个路径用UIBezierPath来制作;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
+ (CGPathRef)heartPath

{

CGFloat W = 25;

CGFloat marginX = 10;

CGFloat marginY = 15/25.0 * W;

CGFloat space = 5/25.0 * W;

UIBezierPath *bezierPath = [UIBezierPath new];

[bezierPath moveToPoint:(CGPointMake(marginX + W * 2, W * 4 + space))];

[bezierPath addQuadCurveToPoint:CGPointMake(marginX, W * 2) controlPoint:CGPointMake(W, W * 4 - space)];

[bezierPath addCurveToPoint:CGPointMake(marginX + W * 2, W * 2) controlPoint1:CGPointMake(marginX, marginY) controlPoint2:CGPointMake(marginX + W * 2, marginY)];

[bezierPath addCurveToPoint:CGPointMake(marginX + W * 4, W * 2) controlPoint1:CGPointMake(marginX + W * 2, marginY) controlPoint2:CGPointMake(marginX + W * 4, marginY)];

[bezierPath addQuadCurveToPoint:CGPointMake(marginX + W * 2, W * 4 + space) controlPoint:CGPointMake(marginX * 2 + W * 3, W * 4 - space)];

[bezierPath closePath];

CGAffineTransform T = CGAffineTransformMakeScale(3.0, 3.0);

return CGPathCreateCopyByTransformingPath(bezierPath.CGPath, &T);

}

2.创建CAReplicatorLayer,添加上CAKeyframeAnimation动效;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30
+ (CALayer *)replicatorLayer_Heart{

CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer new];

replicatorLayer.frame = CGRectMake(0, 0, 200, 200);

//    replicatorLayer.backgroundColor = [UIColor colorWithWhite:0 alpha:0.75].CGColor;

CALayer *subLayer = [CALayer new];

subLayer.bounds = CGRectMake(60, 105, 10, 10);

subLayer.backgroundColor = [UIColor colorWithWhite:0.8 alpha:1.0].CGColor;

subLayer.borderColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;

subLayer.borderWidth = 1.0;

subLayer.cornerRadius = 5.0;

subLayer.shouldRasterize = YES;

subLayer.rasterizationScale = [UIScreen mainScreen].scale;

[replicatorLayer addSublayer:subLayer];

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

move.path = [self heartPath];

move.repeatCount = INFINITY;

move.duration = 6.0;

//    move.autoreverses = YES;

[subLayer addAnimation:move forKey:nil];

replicatorLayer.instanceDelay = 6/50.0;

replicatorLayer.instanceCount = 50;

replicatorLayer.instanceColor = [UIColor orangeColor].CGColor;

replicatorLayer.instanceGreenOffset = -0.03;

return replicatorLayer;

}

3.创建一个UIView,将CAReplicatorLayer添加上去。

1

2

3

4

5

6

7

8
- (void)setReplicatorLayerType:(YUReplicatorLayerType)replicatorLayerType

{

CGFloat width = 100;

UIView *aniView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, width, width)];

[self.view addSubview:aniView];

[aniView.layer addSublayer: [YUReplicatorAnimation replicatorLayerWithType:replicatorLayerType]];

self.view.backgroundColor = [UIColor grayColor];

}

##CAReplicatorLayer动画效果合集:

##实现:点击下载demo源代码

二、粒子动画 CAEmitterLayer

CAEmitterLayer 是一个高性能的粒子引擎,被用来创建复杂的粒子动画如:烟雾,火,雨等效果,并且很好地控制了性能。

CAEmitterLayer 看上去像是许多 CAEmitterCell 的容器,这些 CAEmitterCell 定义了一个例子效果。你将会为不同的例子效果定义一个或多个 CAEmitterCell 作为模版,同时 CAEmitterLayer 负责基于这些模版实例化一个粒子流。一个 CAEmitterCell 类似于一个 CALayer :它有一个 contents 属性可以定义为一个 CGImage ,另外还有一些可设置属性控制着表现和行为。

##下雪效果:

三、渐变层 CAGradientLayer

使用CAGradientLayer可以实现色差动画效果。

##效果:

##主要实现代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31
- (void)showLoadingInView:(UIView *)view text:(NSString *)text

{

[view addSubview:self];

if (text) {

self.text = text;

}

[self sizeToFit];

// 创建渐变效果的layer

CAGradientLayer *graLayer = [CAGradientLayer layer];

graLayer.frame = self.bounds;

graLayer.colors = @[(__bridge id)[[UIColor greenColor] colorWithAlphaComponent:0.3].CGColor,

(__bridge id)[UIColor yellowColor].CGColor,

(__bridge id)[[UIColor yellowColor] colorWithAlphaComponent:0.3].CGColor];

graLayer.startPoint = CGPointMake(0, 0);//设置渐变方向起点

graLayer.endPoint = CGPointMake(1, 0);  //设置渐变方向终点

graLayer.locations = @[@(0.0), @(0.0), @(0.1)]; //colors中各颜色对应的初始渐变点

// 创建动画

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"locations"];

animation.duration = 1.0f;

animation.toValue = @[@(0.9), @(1.0), @(1.0)];

animation.removedOnCompletion = NO;

animation.repeatCount = HUGE_VALF;

animation.fillMode = kCAFillModeForwards;

[graLayer addAnimation:animation forKey:@"xindong"];

// 将graLayer设置成textLabel的遮罩

self.layer.mask = graLayer;

}

demo下载

点击下载demo源代码

总结

iOS的动画非常强大,还有很多很多有待我去学习。另外,写的很不好的地方,希望各位大神能够指正,我会尽量去修改,谢谢。

原文:大专栏  几种特殊的layer动画

原文地址:https://www.cnblogs.com/wangziqiang123/p/11618214.html

时间: 2024-11-08 20:28:10

几种特殊的layer动画的相关文章

IOS UIVIEW layer动画 总结

转发自:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/16306_12.html IOS UIVIEW layer动画 总结,有需要的朋友可以参考下. 这是我搜索的所有动画效果,感谢前辈在网上分享. //翻页效果动画 左边 [UIView beginAnimations:@"animation" context:nil]; [UIView setAnimationDuration:1.0f]; [UIView set

通过编码和xml文件两种方式实现tween动画

tween有四种动画效果:alpha(透明).rotate(旋转), translate(移动),scale(缩放); 可以通过硬编码和xml文件这两种方式来实现. xml实现: 第一步:在项目的res文件下面新建一个文件夹名字是anim(必须) 第二步:在anim文件夹下面新建新的xml文件,在xml文件中具体设置动画效果 第三步:在Activity中使用 AnimationUtils.loadAnimation(MainActivity.this,R.anim.xx);来获取. 1.alph

ios中layer动画和UIView动画代码总结

kCATransitionFade淡出 kCATransitionMoveIn覆盖原图 kCATransitionPush推出 kCATransitionReveal底部显出来 pageCurl   向上翻一页 pageUnCurl 向下翻一页 rippleEffect 滴水效果 suckEffect 收缩效果,如一块布被抽走 cube 立方体效果 oglFlip 上下翻转效果 #pragma mark UIView 动画 - (IBAction)pressClick1:(id)sender {

CoreAnimation中layer动画闪烁的原因及解决

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 网上有一段Core Animation层动画的例子,是将view中的云朵从左向右移动,直到移出屏幕,这时再将云朵移到最左端然后重复移动动画. 所有动画在layer上完成,不过有个小问题,就是第一次每朵云动画完成时,会在其原位置处有一个闪烁,然后才会移动到屏幕最右端,而随后的运动动画都没有这个问题了: 由于录制gif文件时使用的帧率比较低,所以上图较难展示这个问

ios layer 动画-(transform.scale篇)

x轴缩放:CABasicAnimation *theAnimation;theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.scale.x"];theAnimation.duration=8;theAnimation.removedOnCompletion = YES;theAnimation.fromValue = [NSNumber numberWithFloat:1];theAnimation.toVal

Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而

08第二种定时器_封装动画函数_轮播图_offset系列

前面复习: 下面会说第二种定时器. 第二种定时器: 第一种的定时器回顾: 另一个定时器 setTimeout() 它是一个一次性的定时器: 因为,代码是从上往下执行的,btn 还没有生成,所以getElementById("btn").onclick = 肯定是会报错的. 它是一次性的定时器,如果没有取消的话,它会一直占着空间,所以一般都要写按钮btn 去取消timeId  . 1 <!DOCTYPE> 2 <html lang="en">

Layer动画的一些注意的点

1.代理设置需要在addAnimation之前,否则无效(CAAnimationGroup) 2.CAAnimation添加到Layer之后,Layer持有的动画,和最初配置生成的CAAnimation不是同一个,需要如果需要进行判断,需要添加到Layer之后通过Key重新获取Layer持有的动画 3.设置ShouldRemove为NO时,同时必须要指定动画的fillModel 如下展示最后的状态: group.fillMode = kCAFillModeForwards; 原文地址:https

cocos2dx 常见的32种切换场景的动画

// TransitionJumpZoom// 作用: 创建一个跳动的过渡动画//    参数1:过渡动作的时间//    参数2:切换到目标场景的对象//    auto action = TransitionJumpZoom ::create(time , scene);// Director::getInstance()->replaceScene(action); // TransitionProgressRadialCCW//    作用: 创建一个扇形条形式的过渡动画, 逆时针方向/