CoreAnimation之CAEmitterLayer

CAEmitterLayer可以來制作粒子發(fā)射系統(tǒng),主要包含兩個(gè)部分CAEmitterLayer和CAEmitterCell。
CAEmitterLayer就是粒子發(fā)射器,決定粒子發(fā)射器的形狀,位置,大小等;CAEmitterCell可以設(shè)置粒子的屬性,包括形狀,大小,速度,加速度,存活時(shí)間等。

CAEmitterLayer的常用屬性:

emitterCells CAEmitterCell對(duì)象的數(shù)組
birthRate 粒子產(chǎn)生系數(shù),默認(rèn)為1.0;CAEmitterLayer也有birthRate屬性,系統(tǒng)每秒實(shí)際產(chǎn)生的粒子數(shù)是這兩個(gè)屬性值的乘積
lifetime 粒子存活時(shí)間,默認(rèn)1s
emitterPosition 發(fā)射器xy坐標(biāo)軸上的位置
emitterZPosition 發(fā)射器在z坐標(biāo)軸上的位置
preservesDepth 是否開啟三維效果
velocity 粒子運(yùn)動(dòng)速度
scale 粒子縮放效果
spin 粒子自旋轉(zhuǎn)速度
seed 隨機(jī)數(shù)發(fā)生器
emitterSize 發(fā)射器尺寸
emitterDepth 發(fā)射器深度
emitterShape 發(fā)射器形狀
????kCAEmitterLayerPoint 點(diǎn)狀
????kCAEmitterLayerLine 線狀
????kCAEmitterLayerRectangle 矩形
????kCAEmitterLayerCuboid 立方體
????kCAEmitterLayerCircle 圓形
????kCAEmitterLayerSphere 球形
emitterMode 發(fā)射模式
????kCAEmitterLayerPoints 從頂點(diǎn)發(fā)出
????kCAEmitterLayerOutline 從邊緣發(fā)出
????kCAEmitterLayerSurface 從表面發(fā)出
????kCAEmitterLayerVolume 從立方體中發(fā)出
renderMode 渲染模式
????kCAEmitterLayerUnordered 粒子無序出現(xiàn)
????kCAEmitterLayerOldestFirst 先聲明的粒子在上層
????kCAEmitterLayerOldestLast 后聲明的粒子在上層
????kCAEmitterLayerBackToFront 在z軸上從后到前渲染
????kCAEmitterLayerAdditive 混合粒子

CAEmitterCell常用屬性:

emitterCell 初始化方法
name 粒子名字
color 粒子顏色
enabled 粒子是否可渲染
contents 粒子內(nèi)容
contentsRect 渲染范圍
birthRate 粒子產(chǎn)生速度
lifetime 生命周期
lifetimeRange 生命周期浮動(dòng)范圍
velocity 粒子初始運(yùn)動(dòng)速度
velocityRange 粒子速度浮動(dòng)范圍
spin 粒子旋轉(zhuǎn)角度
spinrange 粒子旋轉(zhuǎn)角度范圍
scale 粒子縮放比例
scaleRange 粒子縮放比例范圍
scaleSpeed 粒子縮放速度
alphaRange 粒子透明度變化范圍
alphaSpeed 粒子透明度變化速度
redRange 粒子顏色紅色的變化范圍
redSpeed 粒子顏色紅色的變化速度
blueRange 粒子顏色藍(lán)色的變化范圍
blueSpeed 粒子顏色藍(lán)色的變化速度
greenRange 粒子顏色綠色的變化范圍
greenSpeed 粒子顏色綠色的變化速度
xAcceleration x軸方向的加速度分量
yAcceleration y軸方向的加速度分量
zAcceleration z軸方向的加速度分量
emissionRange 粒子發(fā)射角度范圍
emissionLongitude 粒子在xy平面的發(fā)射角度
emissionLatitude 粒子在z軸方向的發(fā)射角度

使用CAEmitterLayer做一個(gè)從禮物盒里拋出來禮物的樣式:

    //添加一個(gè)禮物盒
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width/2-10, 600, 50, 50)];
    imgView.image = [UIImage imageNamed:@"禮物盒"];
    [self.view addSubview:imgView];
    //1.創(chuàng)建一個(gè)發(fā)射器
    CAEmitterLayer *emitterLayer = [CAEmitterLayer layer];
    emitterLayer.emitterPosition = CGPointMake(self.view.bounds.size.width/2, 600);
    emitterLayer.emitterShape = kCAEmitterLayerLine;
    emitterLayer.emitterMode = kCAEmitterLayerSurface;
    emitterLayer.emitterSize = CGSizeMake(20, 5);
    //2.創(chuàng)建發(fā)射的粒子
    NSMutableArray *cellsArray = [NSMutableArray array];
    for (int i = 1; i<5; i++) {
        CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
        emitterCell.birthRate = 0.5+0.1*i;
        emitterCell.speed = 1.5;
        emitterCell.velocity = 150;
        emitterCell.velocityRange = 30;
        emitterCell.lifetime = 3.5;
        emitterCell.lifetimeRange = 0.5;
        emitterCell.spin = 1;
        emitterCell.scale = 0.8;
        emitterCell.scaleRange = 0.5;
        emitterCell.emissionLongitude = 0;
        emitterCell.emissionRange = M_PI_4;
        emitterCell.yAcceleration = 120;
        emitterCell.contents = (id)[UIImage imageNamed:[NSString stringWithFormat:@"icon0%d", i]].CGImage;
        [cellsArray addObject:emitterCell];
    }
    emitterLayer.emitterCells = cellsArray;
    [self.view.layer addSublayer:emitterLayer];
emitter1.gif

創(chuàng)建一個(gè)點(diǎn)贊按鈕的動(dòng)畫效果

    CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
    emitterCell.name = @"emitter";
    emitterCell.alphaRange = 0.10;
    emitterCell.alphaSpeed = -1.0;
    emitterCell.lifetime = 0.3;
    emitterCell.lifetimeRange = 0.1;
    emitterCell.birthRate = 0;
    emitterCell.velocity = 40.0;
    emitterCell.velocityRange = 0.00;
    emitterCell.scale = 0.3;
    emitterCell.scaleRange = 0.1;
    emitterCell.contents = (id)[UIImage imageNamed:@"點(diǎn)"].CGImage;
    
    self.emitterLayer = [CAEmitterLayer layer];
    self.emitterLayer.name = @"emitterLayer";
    self.emitterLayer.emitterShape = kCAEmitterLayerCircle;
    self.emitterLayer.emitterMode = kCAEmitterLayerOutline;
    self.emitterLayer.emitterSize = CGSizeMake(20, 0);
    self.emitterLayer.emitterCells = @[emitterCell];
    self.emitterLayer.renderMode = kCAEmitterLayerOldestFirst;
    self.emitterLayer.masksToBounds = NO;
    self.emitterLayer.position = likeBtn.center;
    self.emitterLayer.zPosition = -1;
    [self.view.layer addSublayer:self.emitterLayer];
//處理按鈕點(diǎn)擊
- (void)handleLikeOrNotLike:(UIButton *)button {
    button.selected = !button.selected;
    if (button.selected) {
        self.emitterLayer.beginTime = CACurrentMediaTime();
        //每秒噴射粒子的個(gè)數(shù)為80個(gè)
        [self.emitterLayer setValue:@1000 forKeyPath:@"emitterCells.emitter.birthRate"];
        [self performSelector:@selector(explode) withObject:nil afterDelay:0.1];
    }
    [button setImage:[UIImage imageNamed:@"點(diǎn)贊"] forState:UIControlStateNormal];
    [button setImage:[UIImage imageNamed:@"點(diǎn)贊-2"] forState:UIControlStateSelected];
}
//大量噴射
- (void)explode {
    //每秒噴射的個(gè)數(shù)為2500個(gè)
    [self.emitterLayer setValue:@2500 forKeyPath:@"emitterCells.emitter.birthRate"];
    [self performSelector:@selector(stop) withObject:nil afterDelay:0.1];
}
//停止噴射
- (void)stop {
    //每秒噴射粒子的個(gè)數(shù)為0個(gè)
    [self.emitterLayer setValue:@0 forKeyPath:@"emitterCells.emitter.birthRate"];
}

emitter2.gif

參考鏈接:
http://blog.csdn.net/hero_wqb/article/details/50539444
http://blog.csdn.net/wang631106979/article/details/51258020

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng)中文版 1 簡(jiǎn)易天空替換## 技能:線性擦除,追蹤運(yùn)動(dòng),用顏色鍵K出人物,用色彩曲線調(diào)色。(1)天空?qǐng)D片素材放...
    朱細(xì)細(xì)閱讀 11,650評(píng)論 4 82
  • 一、在 UIKit 中,粒子系統(tǒng)由兩部分組成: 1· 一個(gè)或多個(gè) CAEmitterCells :發(fā)射器電池可以看...
    dongfang閱讀 838評(píng)論 0 0
  • 在iOS 5中,蘋果引入了一個(gè)新的CALayer子類叫做CAEmitterLayer。CAEmitterLayer...
    雪_晟閱讀 837評(píng)論 2 1
  • 開始iOS的動(dòng)效學(xué)習(xí),一開始只對(duì)普通的CALayer有所了解,偶然的機(jī)會(huì)想到做一些全局的飄灑的效果。當(dāng)時(shí)采用最笨的...
    清蘂翅膀的技術(shù)閱讀 3,572評(píng)論 0 11
  • 當(dāng)坐上火車的那一剎那,我知道,那個(gè)我依偎了十八年的地方,即將成為我心中甜蜜又苦澀的眷戀,那個(gè)地方,就是我的故鄉(xiāng)。 ...
    白驪駒閱讀 189評(píng)論 0 0

友情鏈接更多精彩內(nèi)容