學(xué)習(xí)計(jì)劃(7) - 動(dòng)畫(huà) - 粒子動(dòng)畫(huà)

CAEmitterLayer
釋放决摧、動(dòng)畫(huà)和呈現(xiàn)粒子系統(tǒng)。

它是比較完善的粒子渲染引擎了凑兰。所以我們?cè)陂_(kāi)始的時(shí)候需要去熟悉的它的屬性掌桩,因?yàn)槲覀冎恍枰O(shè)置它的屬性就可以做到我們所想要的效果。

粒子發(fā)射器的形狀
@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);
發(fā)射模式票摇,這個(gè)字段規(guī)定了在特定形狀上發(fā)射的具體形式是什么
@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);

具體的參數(shù)效果拘鞋,看這篇文章,本來(lái)錄了一些矢门,好吧盆色。比較懶,而且對(duì)于做重復(fù)的事情沒(méi)啥意義祟剔。
https://www.cnblogs.com/densefog/p/5424155.html

屬性參數(shù):

alphaRange 一個(gè)粒子的顏色alpha能改變的范圍
alphaSpeed 粒子透明度在生命周期內(nèi)的改變速度
birthrate 每秒發(fā)射的粒子數(shù)量
blueRange 一個(gè)粒子的顏色blue 能改變的范圍
blueSpeed 粒子blue在生命周期內(nèi)的改變速度
color 粒子的顏色
contents 是個(gè)CGImageRef的對(duì)象,既粒子要展現(xiàn)的圖片
contentsRect 應(yīng)該畫(huà)在contents里的子rectangle
emissionLatitude 發(fā)射的z軸方向的角度
emissionLongitude x-y平面的發(fā)射方向
emissionRange 周圍發(fā)射角度
emitterCells 粒子發(fā)射的粒子的數(shù)組
enabled 粒子是否被渲染
greenrange 一個(gè)粒子的顏色green 能改變的范圍
greenSpeed 粒子green在生命周期內(nèi)的改變速度
lifetime 生命周期
lifetimeRange 生命周期范圍 lifetime= lifetime(+/-) lifetimeRange
magnificationFilter 增加自己的大小
minificatonFilter 減小自己的大小
minificationFilterBias 減小大小的因子
name 粒子的名字
redRange 一個(gè)粒子的顏色red 能改變的范圍
redSpeed 粒子red在生命周期內(nèi)的改變速度
scale 縮放比例
scaleRange 縮放比例范圍
scaleSpeed 縮放比例速度
spin 子旋轉(zhuǎn)角度
spinrange 子旋轉(zhuǎn)角度范圍
velocity 速度
velocityRange 速度范圍
xAcceleration 粒子x方向的加速度分量
yAcceleration 粒子y方向的加速度分量
zAcceleration 粒子z方向的加速度分量

所以我們大概了解一下隔躲,然后我們以實(shí)踐為準(zhǔn)。
我們先看今天實(shí)現(xiàn)的這個(gè)效果,我一直想做一下這個(gè)物延,也比較簡(jiǎn)單宣旱。


like.gif

主要包含了兩種,一種利用CAKeyframeAnimation 關(guān)鍵幀動(dòng)畫(huà)還有CAEmitterLayer做出來(lái)的粒子動(dòng)畫(huà)叛薯。

配置粒子動(dòng)畫(huà)參數(shù)

@property (nonatomic,readwrite,strong)CAEmitterLayer *emitterLayer;
- (void)configerEmitterLayer{
    self.emitterLayer = [[CAEmitterLayer alloc] init];
    //發(fā)射的位置
    [self.emitterLayer setEmitterPosition:self.likeButton.center];
    //發(fā)射源的尺寸大小
    self.emitterLayer.emitterSize  = (CGSize){80,80};
    //發(fā)射源的形狀
    self.emitterLayer.emitterShape = kCAEmitterLayerCircle;
    //發(fā)射源的模式
    self.emitterLayer.emitterMode = kCAEmitterLayerOutline;
    CAEmitterCell *cell = [CAEmitterCell new];
    //cell的內(nèi)容,即可以設(shè)置圖片浑吟,也可以自己繪制圖形轉(zhuǎn)換成圖片
    cell.contents = (id)[PMBTools getBuddleImage:@"start" imageType:@"png"].CGImage;
    //每秒中粒子的數(shù)量
    cell.birthRate = 0.f;
    //粒子從出生到結(jié)束的時(shí)間
    cell.lifetime = 0.3f;
    //粒子生存浮動(dòng)的時(shí)間, [lifetime - lifetimeRange]
    cell.lifetimeRange = 0.5f;
    //運(yùn)動(dòng)的速度
    cell.velocity = 30.f;
    //運(yùn)動(dòng)浮動(dòng)速度[velocity - velocityRange]
    cell.velocityRange = 4.f;
    //Y方向的加速度 值越大每個(gè)粒子下落的速度越快
    cell.yAcceleration = 15.f;
    
    //粒子發(fā)射出來(lái)的角度
    cell.emissionLongitude = 0;
    //粒子發(fā)射出來(lái)的浮動(dòng)角度,這個(gè)角度決定了粒子能夠在多大角度范圍內(nèi)擴(kuò)散
    cell.emissionRange = 180;
    
    //粒子的初始大小
    cell.scale = 0.003;
    //粒子的初始大小的浮動(dòng)范圍 [scal - scaleRange]
    cell.scaleRange = 0.06;
    //粒子縮放的速度
   cell.scaleSpeed = 0.01;
    
//    //粒子的顏色笙纤,這里cell可以對(duì)圖片進(jìn)行新顏色的填充
//    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];
}
關(guān)鍵的參數(shù):
self.emitterLayer.emitterShape = kCAEmitterLayerCircle;
我們想要的效果是點(diǎn)擊的時(shí)候呈現(xiàn)圓形擴(kuò)散,
kCAEmitterLayerCircle的效果就是呈現(xiàn)圓形擴(kuò)散,所以比較符合我們的設(shè)定

self.emitterLayer.emitterMode = kCAEmitterLayerOutline;
這個(gè)模式下整個(gè)邊框都是發(fā)射點(diǎn)组力,即邊框進(jìn)行發(fā)射,而我們上邊設(shè)置的是圓形省容,所以邊框呈現(xiàn)圓形范圍。

然后就是我們需要它在開(kāi)始的時(shí)候沒(méi)有小星星,所以設(shè)置它的
cell.birthRate = 0.f; 不設(shè)置的話默認(rèn)為0燎字。

其它的你們?cè)趺聪矚g怎么來(lái)咯腥椒。

然后就是那個(gè)心心點(diǎn)擊的時(shí)候的動(dòng)畫(huà):


心心動(dòng)畫(huà).gif

通過(guò)觀察其實(shí)就是這個(gè)圖片一個(gè)會(huì)一會(huì)小了,我們可以自己設(shè)置一下它的放大比例和縮小比例候衍。
我們實(shí)現(xiàn)這個(gè)動(dòng)畫(huà)的方式很多笼蛛,但是關(guān)鍵幀動(dòng)畫(huà)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單(關(guān)鍵幀動(dòng)畫(huà)會(huì)單獨(dú)寫(xiě)一篇,這里就簡(jiǎn)單看下實(shí)踐吧):

    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 對(duì)關(guān)鍵幀為座標(biāo)點(diǎn)的關(guān)鍵幀進(jìn)行圓滑曲線相連后插值計(jì)算

    animationWithKeyPath的值:
   transform.scale = 比例轉(zhuǎn)換
    transform.scale.x = 闊的比例轉(zhuǎn)換
    transform.scale.y = 高的比例轉(zhuǎn)換
    transform.rotation.z = 平面圖的旋轉(zhuǎn)
    opacity = 透明度
    margin  四周邊距
    zPosition Z軸位置
    backgroundColor    背景顏色
    cornerRadius    圓角
    borderWidth 邊框?qū)挾?    bounds  
    contents
    contentsRect
    cornerRadius
    frame 
    hidden 是否隱藏
    mask   
    masksToBounds 是否截取邊緣
    opacity  不透明度
    position 位置
    shadowColor 陰影顏色
    shadowOffset 陰影偏移度
    shadowOpacity 陰影不透明度
    shadowRadius 陰影半徑

嗯蛉鹿,配置也好了滨砍,動(dòng)畫(huà)也有了,下面就是開(kāi)啟粒子動(dòng)畫(huà)了

    //首先獲取我們粒子動(dòng)畫(huà)單元榨为。設(shè)置它的粒子數(shù)量
    CAEmitterCell *cell = self.emitterLayer.emitterCells[0];
    [cell setBirthRate:30.f];
    //然后再設(shè)置粒子layer的粒子數(shù)量惨好,如果你只設(shè)置其中的一種,那是么有用的随闺。
    //網(wǎng)上有直接通過(guò)反射設(shè)置的我試過(guò)了沒(méi)有效果日川。還是說(shuō)操作的方式不正確。不過(guò)被我發(fā)現(xiàn)了這個(gè)可用的了矩乐。
    [self.emitterLayer setBirthRate:30.f];
    //設(shè)置粒子動(dòng)畫(huà)立馬顯示
    self.emitterLayer.beginTime = CACurrentMediaTime();
    //想粒子動(dòng)畫(huà)消失其實(shí)就是將粒子設(shè)置為0,都沒(méi)有粒子了自然也就結(jié)束了龄句。
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [self.emitterLayer setBirthRate:0.f];
    });

嗯。到這里點(diǎn)擊心心的動(dòng)畫(huà)也就結(jié)束了散罕。記得把上面的粒子動(dòng)畫(huà)放在上面的關(guān)鍵幀動(dòng)畫(huà)里哦分歇。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市欧漱,隨后出現(xiàn)的幾起案子职抡,更是在濱河造成了極大的恐慌,老刑警劉巖误甚,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缚甩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡窑邦,警方通過(guò)查閱死者的電腦和手機(jī)擅威,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冈钦,“玉大人郊丛,你說(shuō)我怎么就攤上這事。” “怎么了厉熟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵导盅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我庆猫,道長(zhǎng)认轨,這世上最難降的妖魔是什么绅络? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任月培,我火速辦了婚禮,結(jié)果婚禮上恩急,老公的妹妹穿的比我還像新娘杉畜。我一直安慰自己,他們只是感情好衷恭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布此叠。 她就那樣靜靜地躺著,像睡著了一般随珠。 火紅的嫁衣襯著肌膚如雪灭袁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天窗看,我揣著相機(jī)與錄音茸歧,去河邊找鬼。 笑死显沈,一個(gè)胖子當(dāng)著我的面吹牛软瞎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拉讯,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涤浇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了魔慷?” 一聲冷哼從身側(cè)響起只锭,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎院尔,沒(méi)想到半個(gè)月后蜻展,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召边,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铺呵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隧熙。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡片挂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情音念,我是刑警寧澤沪饺,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站闷愤,受9級(jí)特大地震影響整葡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讥脐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一遭居、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旬渠,春花似錦俱萍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至岖免,卻和暖如春岳颇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颅湘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工话侧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栅炒。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓掂摔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赢赊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乙漓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355