CAEmitterLayer簡介:
CAEmitterLayer(粒子發(fā)射器)繼承自CALayer,提供了一個基于Core Animation的粒子發(fā)射系統(tǒng),粒子用CAEmitterCell來初始化,一個單獨的CAEmitterLayer可同時支持多個CAEmitterCell。
簡單來說CAEmitterLayer就是發(fā)射器,可以設(shè)置位置、大小、形狀等屬性;CAEmitterCell就是發(fā)射出來的粒子,可以設(shè)置粒子圖片,速度,旋轉(zhuǎn)等屬性。一個CAEmitterLayer可以同時發(fā)射多種不同的CAEmitterCell。
一、CAEmitterLayer本身沒有什么難度,主要在于兩點:
1、屬性較多
2、調(diào)參數(shù)比較費時(想要有好的動畫效果還得慢慢的去調(diào)整各項參數(shù),不過沒有難度就是有點費時間)
下面先認(rèn)識一下CAEmitterLayer的屬性
// 常用屬性:
NSArray<CAEmitterCell *> *emitterCells; // 用來裝粒子的數(shù)組
CGPoint emitterPosition; // 決定了粒子發(fā)射形狀的中心點
CGFloat emitterZPosition;// 決定了粒子發(fā)射形狀的Z軸位置
CGSize emitterSize; // 發(fā)射源的尺寸大小
NSString *emitterShape; // 發(fā)射源的形狀,有6種值,分別是點、線、矩形、立方體、圓形、球形,具體的實現(xiàn)效果自己可以體驗下。
NSString *emitterMode; // 發(fā)射模式 NSString *renderMode; // 渲染模式// 不常用屬性:
float birthRate; // 粒子產(chǎn)生系數(shù),默認(rèn)1.0 (可以在Cell里面賦值) float lifetime; // 粒子的生命周期系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值) BOOL preservesDepth; // 定義該層是否將其子層壓平到其平面。 CGFloat emitterDepth; // 確定發(fā)射器形狀的深度 float velocity; // 粒子速度系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值) float scale; // 粒子的縮放比例系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值) float spin; // 粒子的自旋轉(zhuǎn)速度系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值) unsigned int seed; // 隨機數(shù)發(fā)生器
二、另外給出部分參數(shù)取值詳解。
1、emitterShape參數(shù)取值:
NSString * const kCAEmitterLayerPoint;//點的形狀,粒子從一個點發(fā)出
NSString * const kCAEmitterLayerLine;//線的形狀,粒子從一條線發(fā)出
NSString * const kCAEmitterLayerRectangle;//矩形形狀,粒子從一個矩形中發(fā)出
NSString * const kCAEmitterLayerCuboid;//立方體形狀,會影響Z平面的效果
NSString * const kCAEmitterLayerCircle;//圓形,粒子會在圓形范圍發(fā)射
NSString * const kCAEmitterLayerSphere;//球型
2、emitterMode參數(shù)取值:
NSString * const kCAEmitterLayerPoints;//從發(fā)射器中發(fā)出
NSString * const kCAEmitterLayerOutline;//從發(fā)射器邊緣發(fā)出
NSString * const kCAEmitterLayerSurface;//從發(fā)射器表面發(fā)出
NSString * const kCAEmitterLayerVolume;//從發(fā)射器中點發(fā)出
3、renderMode參數(shù)取值:
NSString * const kCAEmitterLayerUnordered;//粒子無序出現(xiàn)
NSString * const kCAEmitterLayerOldestFirst;//聲明久的粒子會被渲染在最上層
NSString * const kCAEmitterLayerOldestLast;//年輕的粒子會被渲染在最上層
NSString * const kCAEmitterLayerBackToFront;//粒子的渲染按照Z軸的前后順序進行
NSString * const kCAEmitterLayerAdditive;//粒子混合
三、CAEmitterCell的屬性
其實CAEmitterCell的名字叫粒子,下面詳細的介紹了CAEmitterCell的屬性,只要求大家屬性一下,以后用到了可以再來查閱。
emitterCell:初始化方法。
name: //用于構(gòu)建key paths。這也是后面手動控制動畫開始和結(jié)束的關(guān)鍵。
color:粒子的顏色。
enabled:粒子是否渲染。
contents:渲染粒子,是個CGImageRef的對象,即粒子要展示的圖片。
contentsRect:渲染范圍。
birthRate://每秒生成多少個粒子
lifetime://粒子存活的時間,以秒為單位
lifetimeRange://可以為這個粒子存活的時間再指定一個范圍。
上面兩個屬性如果只用了lifetime那么粒子的存活時間就是固定的,比如lifetime=10,那么粒子10s秒后就消失了。
如果使用了lifetimeRange,比如lifetimeRange=5,那么粒子的存活時間就是在5s~15s這個范圍內(nèi)消失。
velocity://粒子平均初始速度。正數(shù)表示豎直向上,負數(shù)豎直向下。
velocityRange://可以再指定一個范圍。
上面兩個屬性同lifetime和lifetimeRange
spin:粒子旋轉(zhuǎn)速度。
spinrange:粒子旋轉(zhuǎn)速度范圍,同lifetime和lifetimeRange
scale:縮放比例
scaleRange:縮放比例范圍,同lifetime和lifetimeRange
scaleSpeed:縮放比例速度。
alphaRange::一個粒子的顏色alpha能改變的范圍。
alphaSpeed::粒子透明度在生命周期內(nèi)的改變速度。
redRange:一個粒子的顏色red能改變的范圍。
redSpeed:粒子red在生命周期內(nèi)的改變速度。
blueRange:一個粒子的顏色blue能改變的范圍。
blueSpeed:粒子blue在生命周期內(nèi)的改變速度。
greenRange:一個粒子的顏色green能改變的范圍。
greenSpeed:粒子green在生命周期內(nèi)的改變速度。
xAcceleration:粒子x方向的加速度分量。
yAcceleration:粒子y方向的加速度分量。
zAcceleration:粒子z方向的加速度分量。
emissionRange:粒子發(fā)射角度范圍。
emissionLongitude:粒子在xy平面的發(fā)射角度。
emissionLatitude:發(fā)射的z軸方向的發(fā)射角度。
四、CAEmitterLayer及CAEmitterCell屬性介紹完了,我們下邊看一下代碼示例:雪花飄落
self.emitterLayer.emitterPosition = CGPointMake(self.view.width/2, 0);//發(fā)射器中心點
self.emitterLayer.emitterSize = CGSizeMake(self.view.width, 0);//發(fā)射器大小,因為emitterShape設(shè)置成線性所以高度可以設(shè)置成0,
self.emitterLayer.emitterShape = kCAEmitterLayerLine;//發(fā)射器形狀為線性
self.emitterLayer.emitterMode = kCAEmitterLayerOutline;//從發(fā)射器邊緣發(fā)出
NSMutableArray *array = [NSMutableArray array];//CAEmitterCell數(shù)組,存放不同的CAEmitterCell,我這里準(zhǔn)備了四張不同形態(tài)的葉子圖片。
for (int i = 0; i<4; i++) {
NSString *imageName = [NSString stringWithFormat:@"雪花%d",i%2];
CAEmitterCell *snowCell = [CAEmitterCell emitterCell];
snowCell.birthRate = 2;//粒子產(chǎn)生速度
snowCell.lifetime = 20;//粒子存活時間
snowCell.velocity = 10;//初始速度
snowCell.velocityRange = 5;//初始速度的差值區(qū)間,所以初始速度為5~15,后面屬性range算法相同
snowCell.yAcceleration = 7;//y軸方向的加速度,落葉下飄只需要y軸正向加速度。
snowCell.spin = 1.0;//粒子旋轉(zhuǎn)速度
snowCell.spinRange = 2.0;//粒子旋轉(zhuǎn)速度范圍
snowCell.emissionRange = M_PI;//粒子發(fā)射角度范圍
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;//設(shè)置粒子組
關(guān)于粒子動及屬性及示例,就寫到這里了,更多動畫請參照[demo]。