CAEmitterLayer簡介:
CAEmitterLayer(粒子發(fā)射器)繼承自CALayer史汗,提供了一個基于Core Animation的粒子發(fā)射系統(tǒng),粒子用CAEmitterCell來初始化列肢,一個單獨(dú)的CAEmitterLayer可同時支持多個CAEmitterCell。
CAEmitterLayer屬性:
emitterCells:CAEmitterCell對象的數(shù)組蝶缀,用于把粒子投放到layer上裳凸。
birthRate:粒子產(chǎn)生速度,默認(rèn)1個每秒缤至。
lifetime:粒子純在時間潮罪,默認(rèn)1秒。
emitterPosition:發(fā)射器在xy平面的中心位置领斥。
emitterZPosition:發(fā)射器在z平面的位置嫉到。
preservesDepth:是否開啟三維效果。
velocity:粒子運(yùn)動速度月洛。
scale:粒子的縮放比例何恶。
spin:自旋轉(zhuǎn)速度。
seed:用于初始化隨機(jī)數(shù)產(chǎn)生的種子嚼黔。
emitterSize:發(fā)射器的尺寸细层。
emitterDepth:發(fā)射器的深度惜辑。
emitterShape:發(fā)射器的形狀
NSString * const kCAEmitterLayerPoint;//點(diǎn)的形狀,粒子從一個點(diǎn)發(fā)出
NSString * const kCAEmitterLayerLine;//線的形狀疫赎,粒子從一條線發(fā)出
NSString * const kCAEmitterLayerRectangle;//矩形形狀韵丑,粒子從一個矩形中發(fā)出
NSString * const kCAEmitterLayerCuboid;//立方體形狀,會影響Z平面的效果
NSString * const kCAEmitterLayerCircle;//圓形虚缎,粒子會在圓形范圍發(fā)射
NSString * const kCAEmitterLayerSphere;//球型
emitterMode:發(fā)射器發(fā)射模式
NSString * const kCAEmitterLayerPoints;//從發(fā)射器中發(fā)出
NSString * const kCAEmitterLayerOutline;//從發(fā)射器邊緣發(fā)出
NSString * const kCAEmitterLayerSurface;//從發(fā)射器表面發(fā)出
NSString * const kCAEmitterLayerVolume;//從發(fā)射器中點(diǎn)發(fā)出
renderMode:發(fā)射器渲染模式
NSString * const kCAEmitterLayerUnordered;//粒子無序出現(xiàn)
NSString * const kCAEmitterLayerOldestFirst;//聲明久的粒子會被渲染在最上層
NSString * const kCAEmitterLayerOldestLast;//年輕的粒子會被渲染在最上層
NSString * const kCAEmitterLayerBackToFront;//粒子的渲染按照Z軸的前后順序進(jìn)行
NSString * const kCAEmitterLayerAdditive;//粒子混合
CAEmitterCell屬性:
emitterCell:初始化方法。
name:粒子的名字钓株。
color:粒子的顏色实牡。
enabled:粒子是否渲染。
contents:渲染粒子轴合,是個CGImageRef的對象创坞,即粒子要展示的圖片。
contentsRect:渲染范圍受葛。
birthRate:粒子產(chǎn)生速度题涨。
lifetime:生命周期。
lifetimeRange:生命周期增減范圍总滩。
velocity:粒子運(yùn)動速度纲堵。
velocityRange:速度范圍。
spin:粒子旋轉(zhuǎn)角度闰渔。
spinrange:粒子旋轉(zhuǎn)角度范圍席函。
scale:縮放比例。
scaleRange:縮放比例范圍冈涧。
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ā)射角度硝训。
做了一個小Demo响委,效果圖如下:
下面貼上代碼:
[objc]view plaincopy
#import?"ViewController.h"
//獲得屏幕的寬高
#define?mainW?[UIScreen?mainScreen].bounds.size.width
#define?mainH?[UIScreen?mainScreen].bounds.size.height
@interfaceViewController?()
@property(nonatomic,strong)CAEmitterLayer*noteEmitter;
@property(nonatomic,strong)CAEmitterLayer*petalEmitter;
@property(nonatomic,strong)CAEmitterLayer*sunEmitter;
@end
@implementationViewController
-?(void)viewDidLoad?{
[superviewDidLoad];
self.view.backgroundColor=?[UIColorwhiteColor];
//創(chuàng)建控件
[selfcreatControl];
}
-?(void)creatControl
{
//唱歌小人背景
UIImageView*imageView?=?[[UIImageViewalloc]initWithFrame:CGRectMake((mainW?-170)?*0.5,?mainH?-350,170,230)];
imageView.image=?[UIImageimageNamed:@"bj.jpg"];
[self.viewaddSubview:imageView];
//按鈕標(biāo)題數(shù)組
NSArray*titleArray?=?@[@"唱歌",@"花瓣",@"太陽",@"停止"];
//按鈕寬度
CGFloat?btnWidth?=70;
//按鈕間距
CGFloat?padding?=?(mainW?-btnWidth*?titleArray.count)?/?(titleArray.count+1);
//創(chuàng)建按鈕
for(inti?=0;?i?<?titleArray.count;?i++)?{
UIButton*btn?=?[[UIButtonalloc]initWithFrame:CGRectMake(padding?+?(padding?+?btnWidth)?*?i,?CGRectGetMaxY(imageView.frame)?+20,?btnWidth,30)];
[btnsetTitle:titleArray[i]forState:UIControlStateNormal];
[btnsetBackgroundColor:[UIColororangeColor]];
btn.tag=?i;
[btnaddTarget:selfaction:@selector(btnOnClick:)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:btn];
}
}
-?(void)btnOnClick:(UIButton*)btn
{
//唱歌按鈕點(diǎn)擊事件
if(btn.tag==0)?{
//重復(fù)點(diǎn)擊先清空發(fā)射器
[_noteEmitterremoveFromSuperlayer];
_noteEmitter?=nil;
//初始化發(fā)射器
_noteEmitter?=?[[CAEmitterLayeralloc]init];
//粒子發(fā)射位置
_noteEmitter.emitterPosition=?CGPointMake(mainW*0.5+15,390);
//發(fā)射源的尺寸大小
_noteEmitter.emitterSize=?CGSizeMake(10,10);
//發(fā)射模式
_noteEmitter.renderMode=?kCAEmitterLayerUnordered;
//發(fā)射源的形狀
_noteEmitter.emitterMode=?kCAEmitterLayerSurface;
//發(fā)射單元
NSMutableArray*cellArray?=?[NSMutableArrayarray];
for(inti?=0;?i?<3;?i++)?{
CAEmitterCell*note?=?[CAEmitterCellemitterCell];
//粒子產(chǎn)生速度
note.birthRate=0.7+0.5*?i;
note.speed=0.5;
//粒子移動速度
note.velocity=100;
//在原屬性上增減的范圍新思,現(xiàn)在粒子速度范圍是100?-?30?~?100?+?30(70?~?130),其他屬性后加Range同理
note.velocityRange=30;
//粒子生命周期
note.lifetime=0.8;
note.lifetimeRange=0.1;
//粒子旋轉(zhuǎn)速度
note.spin=1;
//粒子縮放比例
note.scale=0.1;
note.scaleSpeed=1;
//粒子透明度變化速度
//????????????note.alphaSpeed?=?-0.8;
//粒子發(fā)射角度
note.emissionLongitude=?M_PI?+?M_PI_2;
note.emissionRange=?M_PI_2;
//隨機(jī)生成圖片名字
NSString*str?=?[NSStringstringWithFormat:@"note%d",?arc4random_uniform(4)];
note.contents=?(__bridgeid)[[UIImageimageNamed:str]CGImage];
//粒子展示的圖片
NSString*name?=?[NSStringstringWithFormat:@"note%d",i];
//粒子的名字
note.name=?name;
[cellArrayaddObject:note];
}
_noteEmitter.emitterCells=?cellArray;
//添加到layer層
[self.view.layeraddSublayer:_noteEmitter];
//花瓣按鈕點(diǎn)擊事件
}elseif(btn.tag==1)?{
[_petalEmitterremoveFromSuperlayer];
_petalEmitter?=nil;
_petalEmitter?=?[[CAEmitterLayeralloc]init];
_petalEmitter.emitterPosition=?CGPointMake(0,0);
_petalEmitter.emitterSize=?CGSizeMake(mainW,1);
_petalEmitter.renderMode=?kCAEmitterLayerOldestLast;
_petalEmitter.emitterMode=?kCAEmitterLayerPoints;
_petalEmitter.emitterShape=?kCAEmitterLayerRectangle;
NSMutableArray*cellArray?=?[NSMutableArrayarray];
for(inti?=0;?i?<5;?i++)?{
CAEmitterCell*petal?=?[CAEmitterCellemitterCell];
petal.birthRate=0.5+0.2*?i;
petal.velocity=100;
petal.velocityRange=100;
petal.lifetime=10;
petal.spin=0.5;
petal.emissionLongitude=?-M_PI?-?M_PI_2;
petal.emissionRange=?M_PI_2;
NSString*str?=?[NSStringstringWithFormat:@"petal%d",?arc4random_uniform(5)];
petal.contents=?(__bridgeid)[[UIImageimageNamed:str]CGImage];
NSString*name?=?[NSStringstringWithFormat:@"petal%d",i];
petal.name=?name;
[cellArrayaddObject:petal];
}
_petalEmitter.emitterCells=?cellArray;
[self.view.layeraddSublayer:_petalEmitter];
//太陽按鈕點(diǎn)擊事件
}elseif(btn.tag==2)?{
[_sunEmitterremoveFromSuperlayer];
_sunEmitter?=nil;
_sunEmitter?=?[CAEmitterLayerlayer];
_sunEmitter.frame=self.view.bounds;
_sunEmitter.emitterPosition=?CGPointMake(0,0);
_sunEmitter.renderMode=?kCAEmitterLayerAdditive;
CAEmitterCell*sun?=?[[CAEmitterCellalloc]init];
sun.contents=?(__bridgeid)[UIImageimageNamed:@"petal4"].CGImage;
sun.birthRate=800;
sun.lifetime=2.0;
sun.color=?[UIColorcolorWithRed:1green:0.5blue:0.1alpha:1.0].CGColor;
sun.alphaSpeed=?-0.4;
sun.velocity=50;
sun.velocityRange=10;
sun.emissionRange=M_PI*2.0;
_sunEmitter.emitterCells=?@[sun];
[self.view.layeraddSublayer:_sunEmitter];
//停止按鈕點(diǎn)擊事件
}elseif(btn.tag==3)?{
[_noteEmitterremoveFromSuperlayer];
_noteEmitter?=nil;
[_petalEmitterremoveFromSuperlayer];
_petalEmitter?=nil;
[_sunEmitterremoveFromSuperlayer];
_sunEmitter?=nil;
}
}
@end