CAEmitterLayer简介:
CAEmitterLayer(粒子发射器)继承自CALayer,提供了一个基于Core Animation的粒子发射系统,粒子用CAEmitterCell来初始化,一个单独的CAEmitterLayer可同时支持多个CAEmitterCell。
简单来说CAEmitterLayer就是发射器,可以设置位置、大小、形状等属性;CAEmitterCell就是发射出来的粒子,可以设置粒子图片,速度,旋转等属性。一个CAEmitterLayer可以同时发射多种不同的CAEmitterCell。
一、CAEmitterLayer本身没有什么难度,主要在于两点:
1、属性较多
2、调参数比较费时(想要有好的动画效果还得慢慢的去调整各项参数,不过没有难度就是有点费时间)
下面先认识一下CAEmitterLayer的属性
// 常用属性:
NSArray
*emitterCells; // 用来装粒子的数组 CGPoint emitterPosition; // 决定了粒子发射形状的中心点
CGFloat emitterZPosition;// 决定了粒子发射形状的Z轴位置
CGSize emitterSize; // 发射源的尺寸大小
NSString *emitterShape; // 发射源的形状,有6种值,分别是点、线、矩形、立方体、圆形、球形,具体的实现效果自己可以体验下。
NSString *emitterMode; // 发射模式 NSString *renderMode; // 渲染模式
// 不常用属性:
float birthRate; // 粒子产生系数,默认1.0 (可以在Cell里面赋值) float lifetime; // 粒子的生命周期系数, 默认1.0 (可以在Cell里面赋值) BOOL preservesDepth; // 定义该层是否将其子层压平到其平面。 CGFloat emitterDepth; // 确定发射器形状的深度 float velocity; // 粒子速度系数, 默认1.0 (可以在Cell里面赋值) float scale; // 粒子的缩放比例系数, 默认1.0 (可以在Cell里面赋值) float spin; // 粒子的自旋转速度系数, 默认1.0 (可以在Cell里面赋值) unsigned int seed; // 随机数发生器
二、另外给出部分参数取值详解。
1、emitterShape参数取值:
NSString * const kCAEmitterLayerPoint;//点的形状,粒子从一个点发出
NSString * const kCAEmitterLayerLine;//线的形状,粒子从一条线发出
NSString * const kCAEmitterLayerRectangle;//矩形形状,粒子从一个矩形中发出
NSString * const kCAEmitterLayerCuboid;//立方体形状,会影响Z平面的效果
NSString * const kCAEmitterLayerCircle;//圆形,粒子会在圆形范围发射
NSString * const kCAEmitterLayerSphere;//球型
2、emitterMode参数取值:
NSString * const kCAEmitterLayerPoints;//从发射器中发出
NSString * const kCAEmitterLayerOutline;//从发射器边缘发出
NSString * const kCAEmitterLayerSurface;//从发射器表面发出
NSString * const kCAEmitterLayerVolume;//从发射器中点发出
3、renderMode参数取值:
NSString * const kCAEmitterLayerUnordered;//粒子无序出现
NSString * const kCAEmitterLayerOldestFirst;//声明久的粒子会被渲染在最上层
NSString * const kCAEmitterLayerOldestLast;//年轻的粒子会被渲染在最上层
NSString * const kCAEmitterLayerBackToFront;//粒子的渲染按照Z轴的前后顺序进行
NSString * const kCAEmitterLayerAdditive;//粒子混合
三、CAEmitterCell的属性
其实CAEmitterCell的名字叫粒子,下面详细的介绍了CAEmitterCell的属性,只要求大家属性一下,以后用到了可以再来查阅。
emitterCell:初始化方法。
name: //用于构建key paths。这也是后面手动控制动画开始和结束的关键。
color:粒子的颜色。
enabled:粒子是否渲染。
contents:渲染粒子,是个CGImageRef的对象,即粒子要展示的图片。
contentsRect:渲染范围。
birthRate://每秒生成多少个粒子
lifetime://粒子存活的时间,以秒为单位
lifetimeRange://可以为这个粒子存活的时间再指定一个范围。
上面两个属性如果只用了lifetime那么粒子的存活时间就是固定的,比如lifetime=10,那么粒子10s秒后就消失了。
如果使用了lifetimeRange,比如lifetimeRange=5,那么粒子的存活时间就是在5s~15s这个范围内消失。
velocity://粒子平均初始速度。正数表示竖直向上,负数竖直向下。
velocityRange://可以再指定一个范围。
上面两个属性同lifetime和lifetimeRange
spin:粒子旋转速度。
spinrange:粒子旋转速度范围,同lifetime和lifetimeRange
scale:缩放比例
scaleRange:缩放比例范围,同lifetime和lifetimeRange
scaleSpeed:缩放比例速度。
alphaRange::一个粒子的颜色alpha能改变的范围。
alphaSpeed::粒子透明度在生命周期内的改变速度。
redRange:一个粒子的颜色red能改变的范围。
redSpeed:粒子red在生命周期内的改变速度。
blueRange:一个粒子的颜色blue能改变的范围。
blueSpeed:粒子blue在生命周期内的改变速度。
greenRange:一个粒子的颜色green能改变的范围。
greenSpeed:粒子green在生命周期内的改变速度。
xAcceleration:粒子x方向的加速度分量。
yAcceleration:粒子y方向的加速度分量。
zAcceleration:粒子z方向的加速度分量。
emissionRange:粒子发射角度范围。
emissionLongitude:粒子在xy平面的发射角度。
emissionLatitude:发射的z轴方向的发射角度。
四、CAEmitterLayer及CAEmitterCell属性介绍完了,我们下边看一下代码示例:雪花飘落
self.emitterLayer.emitterPosition = CGPointMake(self.view.width/2, 0);//发射器中心点
self.emitterLayer.emitterSize = CGSizeMake(self.view.width, 0);//发射器大小,因为emitterShape设置成线性所以高度可以设置成0,
self.emitterLayer.emitterShape = kCAEmitterLayerLine;//发射器形状为线性
self.emitterLayer.emitterMode = kCAEmitterLayerOutline;//从发射器边缘发出
NSMutableArray *array = [NSMutableArray array];//CAEmitterCell数组,存放不同的CAEmitterCell,我这里准备了四张不同形态的叶子图片。
for (int i = 0; i<4; i++) {
NSString *imageName = [NSString stringWithFormat:@"雪花%d",i%2];
CAEmitterCell *snowCell = [CAEmitterCell emitterCell];
snowCell.birthRate = 2;//粒子产生速度
snowCell.lifetime = 20;//粒子存活时间
snowCell.velocity = 10;//初始速度
snowCell.velocityRange = 5;//初始速度的差值区间,所以初始速度为5~15,后面属性range算法相同
snowCell.yAcceleration = 7;//y轴方向的加速度,落叶下飘只需要y轴正向加速度。
snowCell.spin = 1.0;//粒子旋转速度
snowCell.spinRange = 2.0;//粒子旋转速度范围
snowCell.emissionRange = M_PI;//粒子发射角度范围
snowCell.contents = (id)[[UIImage imageNamed:imageName] CGImage];//粒子图片
snowCell.scale = 0.3;//缩放比例
snowCell.scaleRange = 0.2;//缩放比例
snowCell.alphaSpeed = -0.05;//透明度速度
[array addObject:snowCell];
}
self.emitterLayer.emitterCells = array;//设置粒子组
关于粒子动及属性及示例,就写到这里了,更多动画请参照[demo]。