iOS 动画 —— 礼花效果实例详细

CAEmitterLayer 提供了一个基于 Core Animation 的粒子发射系统,使用它可以实现各种各样的粒子动画效果。此处的礼花效果,就是基于 CAEmitterLayer 的。

fire.gif

- (void)viewDidLoad {
 [super viewDidLoad];
 [self makeFireworksDisplay];
}

- (void)makeFireworksDisplay {
 // 粒子发射系统 的初始化
 CAEmitterLayer *fireworksEmitter = [CAEmitterLayer layer];
 CGRect viewBounds = self.view.layer.bounds;
 // 发射源的位置
 fireworksEmitter.emitterPosition = CGPointMake(viewBounds.size.width/2.0, viewBounds.size.height);
 // 发射源尺寸大小
 fireworksEmitter.emitterSize = CGSizeMake(viewBounds.size.width/2.0, 0.0);
 // 发射模式
 fireworksEmitter.emitterMode = kCAEmitterLayerOutline;
 // 发射源的形状
 fireworksEmitter.emitterShape = kCAEmitterLayerLine;
 // 发射源的渲染模式
 fireworksEmitter.renderMode = kCAEmitterLayerAdditive;
 // 发射源初始化随机数产生的种子
 fireworksEmitter.seed = (arc4random()%100)+1;

 /**
  * 添加发射点
  一个圆(发射点)从底下发射到上面的一个过程
  */
 CAEmitterCell* rocket = [CAEmitterCell emitterCell];
 rocket.birthRate = 1.0; //是每秒某个点产生的effectCell数量
 rocket.emissionRange = 0.25 * M_PI; // 周围发射角度
 rocket.velocity = 400; // 速度
 rocket.velocityRange = 100; // 速度范围
 rocket.yAcceleration = 75; // 粒子y方向的加速度分量
 rocket.lifetime = 1.02; // effectCell的生命周期,既在屏幕上的显示时间要多长。

 // 下面是对 rocket 中的内容,颜色,大小的设置
 rocket.contents = (id) [[UIImage imageNamed:@"circle"] CGImage];
 rocket.scale = 0.2;
 rocket.color = [[UIColor redColor] CGColor];
 rocket.greenRange = 1.0;
 rocket.redRange = 1.0;
 rocket.blueRange = 1.0;
 rocket.spinRange = M_PI; // 子旋转角度范围

 /**
  * 添加爆炸的效果,突然之间变大一下的感觉
  */
 CAEmitterCell* burst = [CAEmitterCell emitterCell];
 burst.birthRate = 1.0;
 burst.velocity = 0;
 burst.scale = 2.5;
 burst.redSpeed =-1.5;
 burst.blueSpeed =+1.5;
 burst.greenSpeed =+1.0;
 burst.lifetime = 0.35;

 /**
  * 添加星星扩散的粒子
  */
 CAEmitterCell* spark = [CAEmitterCell emitterCell];
 spark.birthRate = 400;
 spark.velocity = 125;
 spark.emissionRange = 2* M_PI;
 spark.yAcceleration = 75; //粒子y方向的加速度分量
 spark.lifetime = 3;

 spark.contents = (id) [[UIImage imageNamed:@"star"] CGImage];
 spark.scaleSpeed =-0.2;
 spark.greenSpeed =-0.1;
 spark.redSpeed = 0.4;
 spark.blueSpeed =-0.1;
 spark.alphaSpeed =-0.25; // 例子透明度的改变速度
 spark.spin = 2* M_PI; // 子旋转角度
 spark.spinRange = 2* M_PI;

 // 将 CAEmitterLayer 和 CAEmitterCell 结合起来
 fireworksEmitter.emitterCells = [NSArray arrayWithObject:rocket];
 //在圈圈粒子的基础上添加爆炸粒子
 rocket.emitterCells = [NSArray arrayWithObject:burst];
 //在爆炸粒子的基础上添加星星粒子
 burst.emitterCells = [NSArray arrayWithObject:spark];
 // 添加到图层上
 [self.view.layer addSublayer:fireworksEmitter];

}

CAEmitterLayer

CAEmitterLayer是QuartzCore提供的粒子引擎, 可用于制作美观的粒子特效。其实也可以说它是装载CAEmitterCell的容器, 有一个属性emitterCells, 将CAEmitterCell直接添加到该数组中, 即可实现粒子效果啦。

// 可能用到是属性
* birthRate:粒子产生系数,默认1.0;
* emitterCells: 装着CAEmitterCell对象的数组,被用于把粒子投放到layer上;
* emitterDepth:决定粒子形状的深度联系:emittershape
* emitterMode:发射模式
* emitterPosition:发射位置
* emitterShape:发射源的形状;
* emitterSize:发射源的尺寸大;
* emitterZposition:发射源的z坐标位置;
* lifetime:粒子生命周期
* preservesDepth:不是多很清楚(粒子是平展在层上)
* renderMode:渲染模式:
* scale:粒子的缩放比例:
* seed:用于初始化随机数产生的种子
* spin:自旋转速度
* velocity:粒子速度

CAEmitterCell

CAEmitterCell用来表示一个个的粒子, 它有一系列的参数用于设置效果。

// 可能用到的属性
* birthRate 这个必须要设置,具体含义是每秒某个点产生的effectCell数量
* alphaRange:  一个粒子的颜色alpha能改变的范围;
* alphaSpeed:粒子透明度在生命周期内的改变速度;
* blueRange:一个粒子的颜色blue 能改变的范围;
* blueSpeed: 粒子blue在生命周期内的改变速度;
* color:粒子的颜色
* contents:是个CGImageRef的对象,既粒子要展现的图片;
* contentsRect:应该画在contents里的子rectangle:
* emissionLatitude:发射的z轴方向的角度
* emissionLongitude:x-y平面的发射方向
* emissionRange;周围发射角度
* emitterCells:粒子发射的粒子
* enabled:粒子是否被渲染
* greenrange: 一个粒子的颜色green 能改变的范围;
* greenSpeed: 粒子green在生命周期内的改变速度;
* lifetime:生命周期
* lifetimeRange:生命周期范围
* magnificationFilter:不是很清楚好像增加自己的大小
* minificatonFilter:减小自己的大小
* minificationFilterBias:减小大小的因子
* name:粒子的名字
* redRange:一个粒子的颜色red 能改变的范围;
* redSpeed; 粒子red在生命周期内的改变速度;
* scale:缩放比例:
* scaleRange:缩放比例范围;
* scaleSpeed:缩放比例速度:
* spin:子旋转角度
* spinrange:子旋转角度范围
* style:不是很清楚:
* velocity:速度
* velocityRange:速度范围
* xAcceleration:粒子x方向的加速度分量
* yAcceleration:粒子y方向的加速度分量
* zAcceleration:粒子z方向的加速度分量

感觉CAEmitterLayer 是一个很有意思的东东,目前先把基本知识点笔记在此,还是需要不断的实战经验方能更好的运用它。
备注参考:http://www.jb51.net/article/93043.htm

文/天空中的球(简书作者)
原文链接:http://www.jianshu.com/p/08cbe521afe5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

(0)

相关推荐

  • IOS 实现3D 浮动效果动画

    涉及到的技术点 CATransform3DRotate 转换坐标系 整体视图的层级结构 tvOSCardView cardImageView cardParallaxView 转换坐标系的代码 CGFloat xFactor = MIN(1, MAX(-1, (touchPoint.x - (self.bounds.size.width / 2)) / (self.bounds.size.width / 2))); CGFloat yFactor = MIN(1, MAX(-1, (touchP

  • iOS 雷达效果实例详解

    iOS雷达效果 这段时间新app开始了,有个产品需求是做一个类似如下效果的雷达图: 中间的图片是用户头像,然后需要展示一个雷达扫描的效果. 分析下雷达图的大致构成: 底部一个呈现用户头像的UIImageView 几个颜色渐变的同心圆,这些同心圆. 只需要在雷达视图的drawRect方法里画就可以了 盖在最上层的一个扇形,且扇形的圆心和雷达图视图的圆心是同一个点.扫描效果就是让这个扇形绕圆心转,因此把这个扇形抽成一个单独的类比较好. 同时这个雷达图应该提供两个接口:开始动画,暂停动画.因此雷达图的

  • IOS 应用之间的跳转和数据传递详解

    说明:本文介绍app如何打开另一个app,并且传递数据. 一.简单说明 新建两个应用,分别为应用A和应用B. 实现要求:在appA的页面中点击对应的按钮,能够打开appB这个应用. 1.新建两个应用,分别为A和B. 142354418874108[1].png 150002248248878[1].png 2.设置应用B的url. 150005160123679[1].png 3.在应用A中编写打开app的代码 150007446066083[1].png 点击之后,会跳转到新的控制器. 注意:

  • IOS 多线程GCD详解

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. #definedispatch_get_main_queue() \DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q) 可以看出,dispatch_get_main_queue也是一种disp

  • IOS 粒子系统 (CAEmitterLayer)实例详解

    一.系统剖析 在UIKit中,粒子系统由两部分组成: ·      一个或多个CAEmitterCells:发射器电池可以看作是单个粒子的原型(例如,一个单一的粉扑在一团烟雾).当散发出一个粒子,UIKit根据这个发射粒子和定义的基础上创建一个随机粒子.此原型包括一些属性来控制粒子的图片,颜色,方向,运动,缩放比例和生命周期. ·      一个或多个CAEmitterLayers,但通常只有一个:这个发射的层主要控制粒子的形状(例如,一个点,矩形或圆形)和发射的位置(例如,在矩形内,或边缘).

  • iOS 利用动画和贝塞尔实现咻咻效果

    先上效果图: 圆形 方形 思路分析: 这四种风格其实就是两种, 一种是动画效果在视图View的内部, 另一种是在视图的外部! 我们可以尝试封装自定义 View 设置相关属性去实现这两个风格. 点击时候触及动画, 说明要在这个 View 上添加手势! 分析动画效果其实是两种, 第一种是视图的比例由小到大,第二种是动画显示效果是渐渐变暗! 那么我们可以把两种效果写到一个动画组中!还有一个问题是效果的形状, 也就是 Layer 动画展示的形状有方形有圆形, 这个形状就需要我们思考如何去绘制和判断! 代

  • iOS 引导页的镂空效果实例

    初衷 最近项目新功能更改较大,产品童鞋要求加入新功能引导,于是一口气花了两天的时间做了一个引导页,当然加上后面的修修补补的时间,就不只两天了,不过这事情其实是一劳永逸的事情,值得做.同时为了能够更好的复用,我把它做成了pod库,项目地址在这里:EAFeatureGuideView. EAFeatureGuideView能做什么 EAFeatureGuideView是UIView的一个扩展,用来做新功能引导提示,达到这样的效果: 局部区域高亮(可以设置圆角) 有箭头指向高亮区域 可以设置一段介绍文

  • iOS 屏幕解锁文字动画效果

    CAGradientLayer相信大家都比较熟悉,关于其如何使用,我就不在这里废话了,网上有很多介绍,想详细了解的话,可以去看看.我只简单说下如何利用CAGradientLayer制作屏幕解锁文字动画效果. 1.创建一个CAGradientLayer对象gradLayer,设置它的frame和label.bounds一样(这里要注意一下是Label的bounds不是frame); 2.这里我给gradLayer.colors一共设置了三个颜色值,首尾颜色透明度设置成0.3,中间的颜色值透明度保持

  • IOS 圆球沿着椭圆轨迹做动画

    前言:最近公司项目有个需求,需要实现让一个view沿着椭圆轨迹做动画,效果实现后,就自己封装做了一个小demo,使用更方便.先看效果: 椭圆.gif 效果图中的白色椭圆轨迹线其实是用贝塞尔曲线画出来的,为了清晰的看出来运动的轨迹.其实项目中是不显示轨迹线的,也就是小球是悬空运动的.若不需要删除掉即可. 实现步骤: 1.首先设定关键帧动画CAKeyframeAnimation的一些属性,比如运动时间和重复次数和calculationMode模式,我们选择kCAAnimationPaced 使得动画

  • iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer

    iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer shape.gif demo.png - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor redColor

  • IOS 波纹进度(waveProgress)动画实现

    LXWaveProgress A simple wave components 一个简单的波浪进度动画,高度可定制.具体效果见Demo. 使用方法 LXWaveProgressView *progressView1 = [[LXWaveProgressView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; progressView1.center=CGPointMake(CGRectGetMidX(self.view.bounds), 270

随机推荐