粒子动画
粒子动画主要是通过CAEmitterLayer
和CAEmitterCell
来完成。使用粒子动画可以实现很多的特效,比如红包雨,点击、星星等。
CAEmitterLayer
CAEmitterLayer
是CALayer
的子类,该类用于实现粒子发射器。通过它来发射粒子来展现动画。CAEmitterLayer
常用属性如下所示:
-
emitterCells
粒子数组,用于添加CAEmitterLayer
对象。
-
birthRate
用于设置粒子产生的系数,默认为1,如果设置为0可以停止发射粒子,用于控制动画的暂停。
-
lifetime
粒子的生命周期,用于控制粒子在屏幕上显示的时间。
-
emitterPosition
粒子发射的位置,默认为原点坐标,还有个emitterZPosition
属性,主要是跟三维的位置相关,先不做具体的说明。
-
emitterSize
用于设置发射器的尺寸。
-
emitterShape
表示粒子从什么形状发射出来。主要包括以下几种枚举类型:
kCAEmitterLayerPoint
kCAEmitterLayerLine
kCAEmitterLayerRectangle
kCAEmitterLayerCuboid
kCAEmitterLayerCircle
kCAEmitterLayerSphere
-
emitterMode
发射模式,用于决定粒子具体的形状。主要包括以下几种枚举类型:
kCAEmitterLayerPoints
kCAEmitterLayerOutline
kCAEmitterLayerSurface
kCAEmitterLayerVolume
-
velocity
用于设置粒子的运行速度的系数。
-
scale
用于设置缩放比例。
-
spin
用于设置粒子的自旋转速度系数。
-
speed
用于设置粒子的随机数发射器。
CAEmitterCell
**CAEmitterCell**
是一个粒子单元,是通过CAEmitterLayer
进行发射的一个粒子单元,CAEmitterLayer
也可以发射粒子。常用的属性如下所示:
-
name
用于设置粒子的名称。
-
enabled
用于设置粒子是否显示。
-
birthRate
用于设置粒子的产生率。
-
lifetime
粒子的生命周期。
-
lifetimeRange
粒子生命周期的范围。
-
emissionRange
粒子发射角度的范围。
-
emissionLatitude
设置粒子的纬度角,相对于发射形状的自然方位角,用于控制不同的方向。
-
emissionLongitude
设置粒子的经度角,相对于发射形状的自然方位角,用于控制不同的方向。
-
velocity
用于设置粒子的运行速度的系数。
-
velocityRange
用于设置粒子的运行速度系数的范围。
-
scale
用于设置缩放比例。
-
scaleRange
用于设置缩放比例范围。
-
scaleSpeed
用于设置缩放比例的速度。
-
spin
用于设置粒子的自旋转速度系数。
-
spinRange
用于设置粒子的自旋转速度系数范围。
-
contents
用于设置粒子的内容,默认为CGImageRef的对象。
-
emitterCells
粒子里面创建的粒子。
-
color
用于设置粒子的颜色,redRange
、greenRange
、blueRange
、alphaRange
:这些是对应的color的RGBA的取值范围,取值范围为01。`redSpeed`、`greenSpeed`、`blueSpeed`、`alphaSpeed`:这些是对应的是粒子的RGBA的变化速度,取值范围为01。表示每秒钟的RGBA的变化率。
下面实现一个点赞的动画,效果如下所示:
#import "MLLiveLikeViewController.h"
@interface MLLiveLikeViewController ()
@property (nonatomic,strong) UIButton *likeBtn;
@property (nonatomic,strong) NSMutableArray *boomCells;
@property (nonatomic,strong) CAEmitterLayer *emitterLayer;
@end
@implementation MLLiveLikeViewController
[个人博客](http://gzcopyright.cn/)
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.likeBtn];
}
- (UIButton *)likeBtn{
if(!_likeBtn){
_likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect frame = self.view.frame;
_likeBtn.frame = CGRectMake(frame.size.width / 2 - 30, frame.size.height / 2 - 10, 60, 30);
[_likeBtn setTitle:@"点赞" forState:UIControlStateNormal];
[_likeBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_likeBtn addTarget:self action:@selector(likeAction) forControlEvents:UIControlEventTouchUpInside];
}
return _likeBtn;
}
-(void)likeAction{
[self addCAEmitteAnimation];
}
-(void)addCAEmitteAnimation
{
CAEmitterLayer *emitter = [CAEmitterLayer layer];
emitter.frame = self.likeBtn.frame;
emitter.lifetime = 10;
[self.view.layer addSublayer:emitter];
emitter.emitterShape = kCAEmitterLayerCircle;
emitter.emitterMode = kCAEmitterLayerCircle;
emitter.emitterPosition = CGPointMake(emitter.frame.size.width/2, emitter.frame.size.height/2);
CAEmitterCell *cell = [[CAEmitterCell alloc] init];
cell.contents = (__bridge id)[UIImage imageNamed:@"heart2"].CGImage;
//产生粒子的个数
cell.birthRate = 15;
//粒子的生命周期
cell.lifetime = 0.5;
cell.lifetimeRange = 1;
//粒子透明度变化
cell.alphaSpeed = -0.4;
//粒子速度
cell.velocity = 100;
cell.velocityRange = 1000;
//粒子发射方向
cell.emissionRange = M_PI *2.0;
//旋转
cell.spin = 0.1;
cell.spin = 1;
emitter.emitterCells = @[cell];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
emitter.birthRate = 0;//停止发射
});
}
具体的代码可以在demo中查看