在iOS 5中,蘋果引入了一個新的CALayer子類叫做CAEmitterLayer。CAEmitterLayer是一個高性能的粒子引擎,被用來創(chuàng)建實時例子動畫如:煙霧,火,雨等等這些效果。
CAEmitterLayer看上去像是許多CAEmitterCell的容器,這些CAEmitierCell定義了一個例子效果。你將會為不同的例子效果定義一個或多個CAEmitterCell作為模版,同時CAEmitterLayer負責(zé)基于這些模版實例化一個粒子流。一個CAEmitterCell類似于一個CALayer:它有一個contents屬性可以定義為一個CGImage,另外還有一些可設(shè)置屬性控制著表現(xiàn)和行為。我們不會對這些屬性逐一進行詳細的描述,你們可以在CAEmitterCell類的頭文件中找到。
** CAEmitterLayer類提供了一個粒子發(fā)射器系統(tǒng)為核心的動畫。這些粒子是由CAEmitterCell組成的實例,它相當于一個管理者,來管理 CAEmitterCell的發(fā)射的一些細節(jié),比如發(fā)射的位置,發(fā)射形狀等等**
| 屬性名 | 作用 |
|---|---|
| emitterPosition | 發(fā)射位置 |
| emitterSize | 發(fā)射源的大小 |
| emitterMode | 發(fā)射模式 |
| emitterShape | 發(fā)射源的形狀 |
| renderMode | 渲染模式 |
| birthRate | 粒子產(chǎn)生系數(shù),默認1.0 |
| emitterCells | 裝著CAEmitterCell對象的數(shù)組,被用于把粒子投放到layer上 |
| emitterDepth | 決定粒子形狀的深度聯(lián)系 |
| emitterZposition | 發(fā)射源的z坐標位置 |
| lifetime | 粒子生命周期 |
| scale | 粒子的縮放比例 |
| seed | 用于初始化隨機數(shù)產(chǎn)生的種子 |
| spin | 自旋轉(zhuǎn)速度 |
| velocity | 粒子速度 |
CAEmitterCell屬性
| 屬性名 | 作用 |
|---|---|
| alphaRange | 一個粒子的顏色alpha能改變的范圍 |
| alphaSpeed | 粒子透明度在生命周期內(nèi)的改變速度 |
| birthrate | 每秒發(fā)射的粒子數(shù)量 |
| blueRange 一個粒子的顏色blue 能改變的范圍 | |
| blueSpeed | 粒子blue在生命周期內(nèi)的改變速度 |
| color | 粒子的顏色 |
| contents | 是個CGImageRef的對象,既粒子要展現(xiàn)的圖片 |
| contentsRect | 應(yīng)該畫在contents里的子rectangle |
| emissionLatitude | 發(fā)射的z軸方向的角度 |
| emissionLongitude | x-y平面的發(fā)射方向 |
| emissionRange | 周圍發(fā)射角度 |
| emitterCells | 粒子發(fā)射的粒子的數(shù)組 |
| enabled | 粒子是否被渲染 |
| greenrange | 一個粒子的顏色green 能改變的范圍 |
| greenSpeed | 粒子green在生命周期內(nèi)的改變速度 |
| lifetime | 生命周期 |
| lifetimeRange | 生命周期范圍 lifetime= lifetime(+/-) lifetimeRange |
| magnificationFilter | 增加自己的大小 |
| minificatonFilter | 減小自己的大小 |
| minificationFilterBias | 減小大小的因子 |
| name | 粒子的名字 |
| redRange | 一個粒子的顏色red 能改變的范圍 |
| redSpeed | 粒子red在生命周期內(nèi)的改變速度 |
| scale | 縮放比例 |
| scaleRange | 縮放比例范圍 |
| scaleSpeed | 縮放比例速度 |
| spin | 子旋轉(zhuǎn)角度 |
| spinrange | 子旋轉(zhuǎn)角度范圍 |
| velocity | 速度 |
| velocityRange | 速度范圍 |
| xAcceleration | 粒子x方向的加速度分量 |
| yAcceleration | 粒子y方向的加速度分量 |
| zAcceleration | 粒子z方向的加速度分量 |
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *containerView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//create particle emitter layer
CAEmitterLayer *emitter = [CAEmitterLayer layer];
emitter.frame = self.containerView.bounds; [self.containerView.layer addSublayer:emitter];
//configure emitter emitter.renderMode = kCAEmitterLayerAdditive;
emitter.emitterPosition = CGPointMake(emitter.frame.size.width / 2.0, emitter.frame.size.height / 2.0);
//create a particle template
CAEmitterCell *cell = [[CAEmitterCell alloc] init];
cell.contents = (__bridge id)[UIImage imageNamed:@"Spark.png"].CGImage; cell.birthRate = 150;
cell.lifetime = 5.0;
cell.color = [UIColor colorWithRed:1 green:0.5 blue:0.1 alpha:1.0].CGColor;
cell.alphaSpeed = -0.4;
cell.velocity = 50;
cell.velocityRange = 50;
cell.emissionRange = M_PI * 2.0; //add particle template to emitter emitter.emitterCells = @[cell];
}
@end
點贊的破碎動畫
self.view.backgroundColor =[UIColor whiteColor];
self.container =[[UIView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
self.container.layer.contents = (__bridge id)[UIImage imageNamed:@"點贊2"].CGImage;
self.container.center = self.view.center;
[self.view addSubview:self.container];
CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
emitterCell.name = @"emitter";
emitterCell.alphaRange = 0.10;
emitterCell.alphaSpeed = -1.0;
emitterCell.lifetime = 0.6;
emitterCell.lifetimeRange = 0.3;
emitterCell.birthRate = 0;
emitterCell.velocity = 40.00;
emitterCell.velocityRange = 10.00;
emitterCell.scale = 0.03;
emitterCell.scaleRange = 0.02;
emitterCell.contents = (id)[UIImage imageNamed:@"Emitter"].CGImage;
self.emitterLayer = [CAEmitterLayer layer];
self.emitterLayer.name = @"emitterLayer";
self.emitterLayer.emitterShape = kCAEmitterLayerCircle;
self.emitterLayer.emitterMode = kCAEmitterLayerOutline;
self.emitterLayer.emitterSize = CGSizeMake(20, 20);
self.emitterLayer.emitterCells = @[emitterCell];
self.emitterLayer.renderMode = kCAEmitterLayerAdditive;
self.emitterLayer.masksToBounds = NO;
self.emitterLayer.position = CGPointMake(self.container.frame.size.width/2.0,self.container.frame.size.height/2.0);
[self.container.layer addSublayer:self.emitterLayer];