学习计划(7) - 动画 - 粒子动画

CAEmitterLayer
释放、动画和呈现粒子系统。

它是比较完善的粒子渲染引擎了。所以我们在开始的时候需要去熟悉的它的属性,因为我们只需要设置它的属性就可以做到我们所想要的效果。

粒子发射器的形状
@property(copy) NSString *emitterShape

以下值:
CA_EXTERN NSString * const kCAEmitterLayerPoint
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerLine
     CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerRectangle
     CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerCuboid
     CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerCircle 
     CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerSphere
     CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
发射模式,这个字段规定了在特定形状上发射的具体形式是什么
@property(copy) NSString *emitterMode;

CA_EXTERN NSString * const kCAEmitterLayerPoints
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerOutline
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerSurface
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAEmitterLayerVolume
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);

具体的参数效果,看这篇文章,本来录了一些,好吧。比较懒,而且对于做重复的事情没啥意义。
https://www.cnblogs.com/densefog/p/5424155.html

属性参数:

alphaRange 一个粒子的颜色alpha能改变的范围
alphaSpeed 粒子透明度在生命周期内的改变速度
birthrate 每秒发射的粒子数量
blueRange 一个粒子的颜色blue 能改变的范围
blueSpeed 粒子blue在生命周期内的改变速度
color 粒子的颜色
contents 是个CGImageRef的对象,既粒子要展现的图片
contentsRect 应该画在contents里的子rectangle
emissionLatitude 发射的z轴方向的角度
emissionLongitude x-y平面的发射方向
emissionRange 周围发射角度
emitterCells 粒子发射的粒子的数组
enabled 粒子是否被渲染
greenrange 一个粒子的颜色green 能改变的范围
greenSpeed 粒子green在生命周期内的改变速度
lifetime 生命周期
lifetimeRange 生命周期范围 lifetime= lifetime(+/-) lifetimeRange
magnificationFilter 增加自己的大小
minificatonFilter 减小自己的大小
minificationFilterBias 减小大小的因子
name 粒子的名字
redRange 一个粒子的颜色red 能改变的范围
redSpeed 粒子red在生命周期内的改变速度
scale 缩放比例
scaleRange 缩放比例范围
scaleSpeed 缩放比例速度
spin 子旋转角度
spinrange 子旋转角度范围
velocity 速度
velocityRange 速度范围
xAcceleration 粒子x方向的加速度分量
yAcceleration 粒子y方向的加速度分量
zAcceleration 粒子z方向的加速度分量

所以我们大概了解一下,然后我们以实践为准。
我们先看今天实现的这个效果,我一直想做一下这个,也比较简单。


like.gif

主要包含了两种,一种利用CAKeyframeAnimation 关键帧动画还有CAEmitterLayer做出来的粒子动画。

配置粒子动画参数

@property (nonatomic,readwrite,strong)CAEmitterLayer *emitterLayer;
- (void)configerEmitterLayer{
    self.emitterLayer = [[CAEmitterLayer alloc] init];
    //发射的位置
    [self.emitterLayer setEmitterPosition:self.likeButton.center];
    //发射源的尺寸大小
    self.emitterLayer.emitterSize  = (CGSize){80,80};
    //发射源的形状
    self.emitterLayer.emitterShape = kCAEmitterLayerCircle;
    //发射源的模式
    self.emitterLayer.emitterMode = kCAEmitterLayerOutline;
    CAEmitterCell *cell = [CAEmitterCell new];
    //cell的内容,即可以设置图片,也可以自己绘制图形转换成图片
    cell.contents = (id)[PMBTools getBuddleImage:@"start" imageType:@"png"].CGImage;
    //每秒中粒子的数量
    cell.birthRate = 0.f;
    //粒子从出生到结束的时间
    cell.lifetime = 0.3f;
    //粒子生存浮动的时间, [lifetime - lifetimeRange]
    cell.lifetimeRange = 0.5f;
    //运动的速度
    cell.velocity = 30.f;
    //运动浮动速度[velocity - velocityRange]
    cell.velocityRange = 4.f;
    //Y方向的加速度 值越大每个粒子下落的速度越快
    cell.yAcceleration = 15.f;
    
    //粒子发射出来的角度
    cell.emissionLongitude = 0;
    //粒子发射出来的浮动角度,这个角度决定了粒子能够在多大角度范围内扩散
    cell.emissionRange = 180;
    
    //粒子的初始大小
    cell.scale = 0.003;
    //粒子的初始大小的浮动范围 [scal - scaleRange]
    cell.scaleRange = 0.06;
    //粒子缩放的速度
   cell.scaleSpeed = 0.01;
    
//    //粒子的颜色,这里cell可以对图片进行新颜色的填充
//    cell.color = getColor(1.f, 1.f, 1.f, 1).CGColor;
//    cell.redRange = 1.0f;
//    cell.greenRange = 1.0f;
//    cell.blueRange = 1.0f;
//    //粒子透明的范围
    cell.alphaRange = 0.8f;
//    //粒子透明的速度
    cell.alphaSpeed = -0.1f;
    
    [self.emitterLayer setEmitterCells:@[cell]];
    [self.view.layer addSublayer:self.emitterLayer];
}
关键的参数:
self.emitterLayer.emitterShape = kCAEmitterLayerCircle;
我们想要的效果是点击的时候呈现圆形扩散,
kCAEmitterLayerCircle的效果就是呈现圆形扩散,所以比较符合我们的设定

self.emitterLayer.emitterMode = kCAEmitterLayerOutline;
这个模式下整个边框都是发射点,即边框进行发射,而我们上边设置的是圆形,所以边框呈现圆形范围。

然后就是我们需要它在开始的时候没有小星星,所以设置它的
cell.birthRate = 0.f; 不设置的话默认为0。

其它的你们怎么喜欢怎么来咯。

然后就是那个心心点击的时候的动画:


心心动画.gif

通过观察其实就是这个图片一个会一会小了,我们可以自己设置一下它的放大比例和缩小比例。
我们实现这个动画的方式很多,但是关键帧动画相对来说比较简单(关键帧动画会单独写一篇,这里就简单看下实践吧):

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    animation.values = @[@1.4,@0.7,@1.0,@1.3,@1.0];
    animation.duration = 0.5;
    animation.calculationMode = kCAAnimationCubic;
    [self.likeButton.layer addAnimation:animation forKey:@"transform.scale"];
    kCAAnimationCubic 对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算

    animationWithKeyPath的值:
   transform.scale = 比例轉換
    transform.scale.x = 闊的比例轉換
    transform.scale.y = 高的比例轉換
    transform.rotation.z = 平面圖的旋轉
    opacity = 透明度
    margin  四周边距
    zPosition Z轴位置
    backgroundColor    背景颜色
    cornerRadius    圆角
    borderWidth 边框宽度
    bounds  
    contents
    contentsRect
    cornerRadius
    frame 
    hidden 是否隐藏
    mask   
    masksToBounds 是否截取边缘
    opacity  不透明度
    position 位置
    shadowColor 阴影颜色
    shadowOffset 阴影偏移度
    shadowOpacity 阴影不透明度
    shadowRadius 阴影半径

嗯,配置也好了,动画也有了,下面就是开启粒子动画了

    //首先获取我们粒子动画单元。设置它的粒子数量
    CAEmitterCell *cell = self.emitterLayer.emitterCells[0];
    [cell setBirthRate:30.f];
    //然后再设置粒子layer的粒子数量,如果你只设置其中的一种,那是么有用的。
    //网上有直接通过反射设置的我试过了没有效果。还是说操作的方式不正确。不过被我发现了这个可用的了。
    [self.emitterLayer setBirthRate:30.f];
    //设置粒子动画立马显示
    self.emitterLayer.beginTime = CACurrentMediaTime();
    //想粒子动画消失其实就是将粒子设置为0,都没有粒子了自然也就结束了。
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [self.emitterLayer setBirthRate:0.f];
    });

嗯。到这里点击心心的动画也就结束了。记得把上面的粒子动画放在上面的关键帧动画里哦。

DEMO:
https://github.com/yanggenwei/GWAnimation/tree/master

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343