今天我們來(lái)看下CAEmitterLayer(粒子發(fā)生器)在開(kāi)發(fā)中的使用
一、CAEmitterLayer 粒子發(fā)生器
1捞烟、CAEmitterLayer是CALayer的一個(gè)子類(lèi),和CAEmitterCell一起使用可以創(chuàng)造出多樣的動(dòng)畫(huà)效果惕虑。
2庇忌、CAEmitterLayer主要用于實(shí)現(xiàn)基于Core Animation的粒子發(fā)生器系統(tǒng)。
3靠汁、在粒子系統(tǒng)中蜂大,CAEmitterLayer負(fù)責(zé)發(fā)射粒子(當(dāng)然粒子也可以發(fā)射粒子),而這些所謂的粒子蝶怔,就是CAEmitterCell奶浦,我們可以將CAEmitterLayer比作是CAEmitterCell的容器,它會(huì)按照你的設(shè)置來(lái)以不同的樣式不斷產(chǎn)生粒子踢星,也就是CAEmitterCell澳叉。
4、CAEmitterLayer決定了粒子從什么樣的幾何特性上發(fā)射出來(lái)沐悦,這個(gè)幾何特性包括了位置成洗,形狀,大小所踊。另外還有一些渲染相關(guān)的特性泌枪。另外的一些屬性是CAEmitterLayer和CAEmiiterCell都有的,CAEmitterLayer的這些屬性會(huì)作為CAEmitterCell相同屬性的系數(shù)秕岛。
例如當(dāng)CAEmitterCell的lifetime(生命周期)為2碌燕,其所屬CAEmitterLayer的lifetime為3時(shí),在其它參數(shù)選擇默認(rèn)值的情況下继薛,這個(gè)CAEmitterCell的生命周期就是2*3=6秒修壕,6秒后,CAEmitterCell就會(huì)從粒子系統(tǒng)中被移除遏考。
5慈鸠、CAEmitterCell則決定了粒子自身的一些特征,例如速度灌具,加速度青团,發(fā)射的范圍譬巫,顏色等等。這些屬性大多是以“中間值”配合一個(gè)范圍值的方式來(lái)表示的督笆。
例如velocity和velocityRange芦昔。表示CAEmitterCell的初始速度為velocity ± velocityRange。
二娃肿、CAEmitterLayer的屬性
CAEmitterLayer類(lèi)提供了一個(gè)粒子發(fā)射器系統(tǒng)為核心的動(dòng)畫(huà)咕缎。這些粒子是由CAEmitterCell組成的實(shí)例,它相當(dāng)于一個(gè)管理者料扰,來(lái)管理 CAEmitterCell的發(fā)射的一些細(xì)節(jié)凭豪,比如發(fā)射的位置,發(fā)射形狀等等晒杈。
/*
@interface CAEmitterLayer : CALayer
--粒子的數(shù)組 把設(shè)置好的粒子放入數(shù)組設(shè)置到layer上
@property(nullable, copy) NSArray*emitterCells;
--粒子產(chǎn)生系數(shù)嫂伞,默認(rèn)1.0;每個(gè)cell的產(chǎn)生率乘以這個(gè)粒子產(chǎn)生系數(shù)拯钻,得出每一秒粒子的創(chuàng)建個(gè)數(shù)末早。 即:cell.birthRate 乘以 layer.birthRate =每秒粒子產(chǎn)生個(gè)數(shù)
@property float birthRate;
--粒子的生命周期系數(shù),默認(rèn)1.0 即:(cell.lifetime 乘以 layer.lifetime)等于粒子的生命周期
@property float lifetime;
--發(fā)射源中心點(diǎn)的位置 默認(rèn)(0,0)
@property CGPoint emitterPosition;
--z軸上的位置
@property CGFloat emitterZPosition;
--是發(fā)射源的大小 并不是layer的大小
@property CGSize emitterSize;
--
@property CGFloat emitterDepth;
--發(fā)射源的形狀 有圓形 方形 線型等 粒子從什么形狀發(fā)射出來(lái)说庭,它并不是表示粒子自己的形狀。
kCAEmitterLayerPoints 點(diǎn)模式郑趁,發(fā)射器是以點(diǎn)的形勢(shì)發(fā)射粒子刊驴。
kCAEmitterLayerOutline 輪廓,即邊上 整個(gè)邊框都是發(fā)射點(diǎn)寡润,即邊框進(jìn)行發(fā)射
kCAEmitterLayerSurface 區(qū)域進(jìn)行拋灑
kCAEmitterLayerVolume 容積捆憎,即3D圖形的體積內(nèi)
@property(copy) NSString *emitterShape;
--發(fā)散形式
kCAEmitterLayerPoint 點(diǎn)形狀,發(fā)射源的形狀就是一個(gè)點(diǎn)梭纹,
kCAEmitterLayerLine 線形狀躲惰,發(fā)射源的形狀是一條線,位置在rect的橫向的位于垂直方向中間那條
kCAEmitterLayerRectangle 矩形狀变抽,發(fā)射源是一個(gè)矩形础拨,
kCAEmitterLayerCuboid 立體矩形形狀,發(fā)射源是一個(gè)立體矩形绍载,這里要生效的話需要設(shè)置z方向的數(shù)據(jù)诡宗,如果不設(shè)置就同矩形狀
kCAEmitterLayerCircle 圓形形狀,發(fā)射源是一個(gè)圓形击儡,形狀為矩形包裹的那個(gè)圓塔沃,二維的
kCAEmitterLayerSphere 立體圓形,三維的圓形阳谍,同樣需要設(shè)置z方向數(shù)據(jù)蛀柴,不設(shè)置則通二維一樣
@property(copy) NSString *emitterMode;
--描繪模式
kCAEmitterLayerUnordered 粒子是無(wú)序出現(xiàn)的螃概,多個(gè)發(fā)射源將混合
kCAEmitterLayerOldestFirst 聲明久的粒子會(huì)被渲染在最上層
kCAEmitterLayerOldestLast 年輕的粒子會(huì)被渲染在最上層
kCAEmitterLayerBackToFront 粒子的渲染按照Z(yǔ)軸的前后順序進(jìn)行
kCAEmitterLayerAdditive 進(jìn)行粒子混合
@property(copy) NSString *renderMode;
--是否展示在z軸上的效果 把圖層進(jìn)行3d變形如沿y軸旋轉(zhuǎn)90度 會(huì)有很明顯的立體效果
@property BOOL preservesDepth;
--粒子速度系數(shù), 默認(rèn)1.0 發(fā)射速度 和cell的速度屬性一起決定了粒子的速度 猜測(cè)粒子的速度是兩者的乘積
而且和cell的速度屬性不同 這個(gè)屬性可以為負(fù) (cell.velocity 乘以 layer.velocity)等于粒子的速度
為負(fù)的時(shí)候發(fā)散方向是向反方向的 為正時(shí)是向指定方向的
@property float velocity;
--粒子的縮放比例系數(shù), 默認(rèn)1.0 縮放大小 和速度相同 粒子的scale值是兩者相乘 cell.scale 乘以 layer.scale)等于粒子的縮放比例
@property float scale;
-- 自旋轉(zhuǎn)速度系數(shù), 默認(rèn)1.0 cell.spin 乘以 layer.spin)等于粒子的自旋轉(zhuǎn)速度
@property float spin;
-- 隨機(jī)數(shù)設(shè)置種子
@property unsigned int seed;
*/
三、CAEmitterCell部分屬性
CAEmitterCell是粒子發(fā)射系統(tǒng)里的粒子鸽疾,用CAEmitterCell來(lái)定義你所需要的粒子的樣式吊洼,圖片,顏色肮韧,方向融蹂,運(yùn)動(dòng),縮放比例和生命周期等等弄企。
/*
@interface CAEmitterCell : NSObject
--粒子的創(chuàng)建
+ (instancetype)emitterCell;
--根據(jù)鍵獲得值
+ (nullable id)defaultValueForKey:(NSString *)key
--是否歸檔鍵值
- (BOOL)shouldArchiveValueForKey:(NSString *)key;
--粒子的名字超燃,默認(rèn)nil.
@property(nullable, copy) NSString *name;
--是否允許被繪制出來(lái)
@property(getter=isEnabled) BOOL enabled;
--生成速率默認(rèn)0
@property float birthRate;
--生存周期以秒為單位。兩者默認(rèn)0
@property float lifetime;
--生存周期的絕對(duì)值的偏移量的最大值
@property float lifetimeRange;
--z軸方向上的發(fā)射角度緯度,緯度角代表了x-z軸平面上與x軸之間的夾角拘领,兩者默認(rèn)0
@property CGFloat emissionLatitude;
--在xy平面上的發(fā)射角度經(jīng)度,經(jīng)度角代表了x-y軸平面上與x軸之間的夾角
@property CGFloat emissionLongitude;
--周?chē)l(fā)射角度,默認(rèn)0
@property CGFloat emissionRange;
--放射速度兩者默認(rèn)0
@property CGFloat velocity;
--速度偏移量
@property CGFloat velocityRange;
--在三個(gè)坐標(biāo)軸上的速度增量可以做出類(lèi)似重力風(fēng)吹的效果默認(rèn)0
@property CGFloat xAcceleration;
@property CGFloat yAcceleration;
@property CGFloat zAcceleration;
--縮放數(shù)值
@property CGFloat scale;
--縮放數(shù)值的偏移量
@property CGFloat scaleRange;
--縮放速度不清楚怎么設(shè)置可能和velocity屬性有關(guān)系
@property CGFloat scaleSpeed;
--旋轉(zhuǎn)
@property CGFloat spin;
--旋轉(zhuǎn)的偏移量
@property CGFloat spinRange;
--設(shè)置cell的顏色content的顏色會(huì)影響實(shí)際顏色默認(rèn)白色
@property(nullable) CGColorRef color;
--設(shè)置三原色和透明度的值偏移值0-1
@property float redRange;
@property float greenRange;
@property float blueRange;
@property float alphaRange;
--變色速率
@property float redSpeed;
@property float greenSpeed;
@property float blueSpeed;
@property float alphaSpeed;
--cell的內(nèi)容一般是UIImage
@property(nullable, strong) id contents;
--內(nèi)容范圍默認(rèn)(0,0,1,1)
@property CGRect contentsRect;
--內(nèi)容縮放
@property CGFloat contentsScale;
--渲染'內(nèi)容'圖像時(shí)使用的濾波器參數(shù)意乓。
@property(copy) NSString *minificationFilter;
@property(copy) NSString *magnificationFilter;
@property float minificationFilterBias;
---粒子發(fā)射的粒子
@property(nullable, copy) NSArray *emitterCells;
@property(nullable, copy) NSDictionary *style;
*/
總結(jié),我們可以emitterShape和emitterMode組合多種需要的效果圖。
四约素、相關(guān)實(shí)例
1届良、仿造微信掉落表情效果圖:
代碼:
- (void)snowAnimation
{
CAEmitterLayer *snowEmitter = [CAEmitterLayer layer];
//降落區(qū)域的方位
snowEmitter.frame = self.view.bounds;
//添加到父視圖Layer上
[self.view.layer addSublayer:snowEmitter];
//指定發(fā)射源的位置
snowEmitter.emitterPosition = CGPointMake(self.view.bounds.size.width / 2.0, -10);
//指定發(fā)射源的大小
snowEmitter.emitterSize = CGSizeMake(self.view.bounds.size.width, 0.0);
//指定發(fā)射源的形狀和模式 層級(jí)
snowEmitter.emitterShape = kCAEmitterLayerLine;
snowEmitter.emitterMode = kCAEmitterLayerOutline;
snowEmitter.renderMode = kCAEmitterLayerOldestFirst;
//創(chuàng)建CAEmitterCell
CAEmitterCell *snowflake = [CAEmitterCell emitterCell];
//每秒多少個(gè)
snowflake.birthRate = 10.0;
//存活時(shí)間
snowflake.lifetime = 50.0;
//初速度,因?yàn)閯?dòng)畫(huà)屬于落體效果圣猎,所以我們只需要設(shè)置它在y方向上的加速度就行了士葫。
snowflake.velocity = 10;
//初速度范圍
snowflake.velocityRange = 5;
//y軸方向的加速度
snowflake.yAcceleration = 30;
//以錐形分布開(kāi)的發(fā)射角度。角度用弧度制送悔。粒子均勻分布在這個(gè)錐形范圍內(nèi)慢显。
snowflake.emissionRange = 5;
//設(shè)置降落的圖片
snowflake.contents = (id) [[UIImage imageNamed:@"love"] CGImage];
//圖片縮放比例
snowflake.scale = 0.5;
//開(kāi)始動(dòng)畫(huà)
snowEmitter.emitterCells = [NSArray arrayWithObject:snowflake];
}
2、煙花效果圖
代碼:
- (void)fireWorkAnimation{
_emitterLayer = [CAEmitterLayer layer];
//發(fā)射源
_emitterLayer.emitterPosition = CGPointMake(self.view.frame.size.width / 2.0, self.view.frame.size.height - 50);
//發(fā)射源尺寸大小
_emitterLayer.emitterSize = CGSizeMake(50, 0);
//發(fā)射源模式
_emitterLayer.emitterMode = kCAEmitterLayerOutline;
//發(fā)射源形狀
_emitterLayer.emitterShape = kCAEmitterLayerLine;
//渲染模式
_emitterLayer.renderMode = kCAEmitterLayerAdditive;
//發(fā)射方向
_emitterLayer.velocity = 1;
//產(chǎn)生粒子數(shù)量
_emitterLayer.seed = (arc4random() % 100 ) + 1;
CAEmitterCell *cell = [CAEmitterCell emitterCell];
//產(chǎn)生的速lv
cell.birthRate = 1.0;
//發(fā)射角度
cell.emissionRange = 0.11 * M_PI;
//速度
cell.velocity = 300;
//范圍
cell.velocityRange = 150;
//y 加速度
cell.yAcceleration = 75;
//存活時(shí)間
cell.lifetime = 2.04;
//cell 內(nèi)容
cell.contents = (__bridge id _Nullable)([UIImage imageNamed:@"FFRing"].CGImage);
//縮放比例
cell.scale = 0.2;
//粒子顏色
cell.color = [[UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:1.0] CGColor];
// 一個(gè)粒子的顏色green 能改變的范圍
cell.greenRange = 1.0;
// 一個(gè)粒子的顏色red 能改變的范圍
cell.redRange = 1.0;
// 一個(gè)粒子的顏色blue 能改變的范圍
cell.blueRange = 1.0;
// 子旋轉(zhuǎn)角度范圍
cell.spinRange = M_PI;
// 爆炸
CAEmitterCell *burst = [CAEmitterCell emitterCell];
// 粒子產(chǎn)生系數(shù)
burst.birthRate = 1.0;
// 速度
burst.velocity = 0;
// 縮放比例
burst.scale = 2.5;
// shifting粒子red在生命周期內(nèi)的改變速度
burst.redSpeed = -1.5;
// shifting粒子blue在生命周期內(nèi)的改變速度
burst.blueSpeed = +1.5;
// shifting粒子green在生命周期內(nèi)的改變速度
burst.greenSpeed = +1.0;
//生命周期
burst.lifetime = 0.35;
// 火花 and finally, the sparks
CAEmitterCell *spark = [CAEmitterCell emitterCell];
//粒子產(chǎn)生系數(shù)欠啤,默認(rèn)為1.0
spark.birthRate = 400;
//速度
spark.velocity = 125;
// 360 deg//周?chē)l(fā)射角度
spark.emissionRange = 2 * M_PI;
// gravity//y方向上的加速度分量
spark.yAcceleration = 75;
//粒子生命周期
spark.lifetime = 3;
//是個(gè)CGImageRef的對(duì)象,既粒子要展現(xiàn)的圖片
spark.contents = (id)
[[UIImage imageNamed:@"FFTspark"] CGImage];
//縮放比例速度
spark.scaleSpeed = -0.2;
//粒子green在生命周期內(nèi)的改變速度
spark.greenSpeed = -0.1;
//粒子red在生命周期內(nèi)的改變速度
spark.redSpeed = 0.4;
//粒子blue在生命周期內(nèi)的改變速度
spark.blueSpeed = -0.1;
//粒子透明度在生命周期內(nèi)的改變速度
spark.alphaSpeed = -0.25;
//子旋轉(zhuǎn)角度
spark.spin = 2* M_PI;
//子旋轉(zhuǎn)角度范圍
spark.spinRange = 2* M_PI;
self.emitterLayer.emitterCells = [NSArray arrayWithObject:cell];
cell.emitterCells = [NSArray arrayWithObjects:burst, nil];
burst.emitterCells = [NSArray arrayWithObject:spark];
[self.view.layer addSublayer:self.emitterLayer];
}
demo: Github