粒子发射动画

由于本人没有找到好的素材,效果图勉强看吧

看下发射效果------真的没去找素材,不然可以更美


粒子发射动画_第1张图片
Snip20161208_2.png

接下来上代码
中间是个button,点击后触发动画

  1. 使用到的类:
    CAKeyframeAnimation // 核心动画-关键帧动画 CAEmitterLayer // 粒子发射器(其实就是一个Layer,其父类是CALayer) CAEmitterCell // 粒子 PS:核心动画应该不用多说了; CAEmitterLayer和CAEmitterCell,我自己是把它们二者比喻成"发射器","发射的炮弹"

  2. 核心代码

2.1 建一个继承UIButton的类
.m文件需要拥有的属性

//粒子发射器
@property(nonatomic,weak) CAEmitterLayer *emitterLayer;

2.2 initWithFrame:方法中配置粒子发射器方法

- (instancetype)initWithFrame:(CGRect)frame
{
    if(self = [super initWithFrame:frame])
    {
        //配置粒子发射器方法
        [self setupEmitter];  
    }
    return self;
}

2.3 setSelected:方法中开启关键帧动画(后面会讲到如何让button调用这个方法)

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    // 开始关键帧动画
    [self animation];
}

2.4 layoutSubviews方法中设置发射器的锚点,也就是说粒子从那里开始发散

- (void)layoutSubviews
{
    [super layoutSubviews];
    //设置粒子发射器的锚点
    _emitterLayer.position = self.imageView.center;
}

2.5 配置粒子发射器的方法具体实现----setupEmitter

- (void)setupEmitter
{
    CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
    // 粒子的名字,在设置喷射个数的时候会用到
    emitterCell.name             = @"emitterCell";
    // 粒子的生命周期和生命周期范围
    emitterCell.lifetime         = 8;
    emitterCell.lifetimeRange    = 8;
    // 粒子的发射速度和速度的范围
    emitterCell.velocity         = 100.00;
    emitterCell.velocityRange    = 80.00;
    // 粒子的缩放比例和缩放比例的范围
    emitterCell.scale            = 0.1;
    emitterCell.scaleRange       = 0.02;
    
    // 粒子透明度改变范围
    emitterCell.alphaRange       = 0.10;
    // 粒子透明度在生命周期中改变的速度
    emitterCell.alphaSpeed       = -1.0;
    // 设置粒子的图片
    emitterCell.contents         = (id)[UIImage imageNamed:@"3"].CGImage;
    
    /// 初始化粒子发射器
    CAEmitterLayer *layer        = [CAEmitterLayer layer];
    // 粒子发射器的 名称
    layer.name                   = @"emitterLayer";
    // 粒子发射器的 形状(可以想象成打仗时,你需要的使用的炮的形状)
    layer.emitterShape           = kCAEmitterLayerCircle;
    // 粒子发射器 发射的模式
    layer.emitterMode            = kCAEmitterLayerOutline;
    // 粒子发射器 中的粒子 (炮要使用的炮弹)
    layer.emitterCells           = @[emitterCell];
    // 定义粒子细胞是如何被呈现到layer中的
    layer.renderMode             = kCAEmitterLayerOldestFirst;
    // 不要修剪layer的边界
    layer.masksToBounds          = NO;
    // z 轴的相对坐标 设置为-1 可以让粒子发射器layer在self.layer下面
    layer.zPosition              = -1;
    // 添加layer
    [self.layer addSublayer:layer];
    _emitterLayer = layer;
}

解释说明:如下参数修改可以自己调整到合适的粒子发射效果(可跳到文档中查看具体说明和默认值)

    // 粒子的生命周期和生命周期范围
    emitterCell.lifetime         = 8;
    emitterCell.lifetimeRange    = 8;
    // 粒子的发射速度和速度的范围
    emitterCell.velocity         = 100.00;
    emitterCell.velocityRange    = 80.00;
    // 粒子的缩放比例和缩放比例的范围
    emitterCell.scale            = 0.1;
    emitterCell.scaleRange       = 0.02;

其中CAEmitterCell的属性一般有两个参数:平均值和"range"
查看官方文档解释为:
每一个Layer都有它自己的随机数发生器,粒子的属性大部分都被定义为一个平均值和一个范围值,
如粒子的速度,这个属性的值分布的区间为:[ M - R / 2,M + R / 2 ]。

然后 这个公式里面
M:均值(拿上面代码说就是 emitterCell.lifetime)
R:范围值(mitterCell.lifetimeRange)

然后我们就可根据公式算出上面我设置的粒子的生命周期的范围是[(8-8)/2 , (8+8)/2]--->[0,8]--->即范围就是8

2.6 开始关键帧动画的具体方法的实现---->[self animation]

- (void)animation {
    // 创建关键帧动画
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    if (self.selected) {
        animation.values = @[@1.5 ,@0.8, @1.0,@1.2,@1.0];
        animation.duration = 0.5;
        // 粒子发射器 发射
        [self startFire];
    }else
    {
        animation.values = @[@0.8, @1.0];
        animation.duration = 0.4;
    }
    // 动画模式
    animation.calculationMode = kCAAnimationCubic;
    [self.imageView.layer addAnimation:animation forKey:@"transform.scale"];
}

2.7 startFire方法

- (void)startFire{
    // 每秒喷射的80个
    [self.emitterLayer setValue:@1000 forKeyPath:@"emitterCells.emitterCell.birthRate"];
    // 开始
    self.emitterLayer.beginTime = CACurrentMediaTime();
    // 执行停止
    [self performSelector:@selector(stopFire) withObject:nil afterDelay:0.1];
    
}

2.8stopFire方法

- (void)stopFire {
    //每秒喷射的个数0个 就意味着关闭了
    [self.emitterLayer setValue:@0 forKeyPath:@"emitterCells.emitterCell.birthRate"];
}
  1. 到控制器中实现效果

3.1 在控制器.m文件中导入该类的头文件

3.2 - (void)viewDidLoad中实例化一个该类对象(UIButton)

    CAEmitterView *btn = [[CAEmitterView alloc] init];
    [self.view addSubview:btn];
    [btn setImage:[UIImage imageNamed:@"1"] forState:UIControlStateNormal];
    btn.frame = CGRectMake(100, 100, 50, 50);
    [btn addTarget:self action:@selector(didclick:) forControlEvents:UIControlEventTouchUpInside];

3.2 点击事件,设置selected

//点击方法
- (void)didclick:(UIButton *)sender
{
    //设置selected为yes,才能调用CAEmitterView中的setSelected方法
    sender.selected = YES;
}

最后run一下该项目点击button就能实现效果了!

你可能感兴趣的:(粒子发射动画)