iOS粒子系統(tǒng)CAEmitterLayer 效果

開始iOS的動效學(xué)習(xí),一開始只對普通的CALayer有所了解,偶然的機會想到做一些全局的飄灑的效果。當(dāng)時采用最笨的方法通過不斷的創(chuàng)建CALayer結(jié)合UIView來實現(xiàn)動畫,效果其實還行。后來了解到CAEmitterLayer這個iOS系統(tǒng)下的粒子系統(tǒng)。

CAEmitterLayer這個CALayer需要設(shè)置的參數(shù)特別的多,每一種參數(shù)都會產(chǎn)生特定的效果,這里自己摸索了下,記錄下來,最后做了個飄灑圓形圖片的效果。

CAEmitterLayer的創(chuàng)建主要包括兩部分:CAEmitterLayer、CAEmitterCell,然后將其關(guān)聯(lián)起來就可以了CAEmitterLayer.emitterCells = @[CAEmitterCell],基本代碼結(jié)構(gòu)如下:

其實這段代碼就是我們創(chuàng)建上面飄落效果的代碼,看吧,我們需要做的事情就是為了達(dá)到所想要的效果而不停的調(diào)整設(shè)置。那么我們需要理解的關(guān)鍵就在于理解里面的各個字段,對每個字段的改變所達(dá)到的效果有個了解。

下面我們列舉下所設(shè)置的參數(shù)以及其對應(yīng)的效果

Layer相關(guān):

position: 發(fā)射位置

CGPointMake(self.view.bounds.size.width, 0)?????????? CGPointMake(self.view.bounds.size.width / 2, 0)

emitterSize:發(fā)射源的尺寸大小,其實這個emitterSize結(jié)合position構(gòu)建了發(fā)射源的位置及大小的矩形區(qū)域rect

emitterShape:發(fā)射源的形狀,這個字段規(guī)定了發(fā)射源的形狀

kCAEmitterLayerPoint:點形狀,發(fā)射源的形狀就是一個點,位置在上面position設(shè)置的位置

kCAEmitterLayerLine:線形狀,發(fā)射源的形狀是一條線,位置在rect的橫向的位于垂直方向中間那條

kCAEmitterLayerRectangle:矩形狀,發(fā)射源是一個矩形,就是上面生成的那個矩形rect

kCAEmitterLayerCuboid:立體矩形形狀,發(fā)射源是一個立體矩形,這里要生效的話需要設(shè)置z方向的數(shù)據(jù),如果不設(shè)置就同矩形狀

kCAEmitterLayerCircle:圓形形狀,發(fā)射源是一個圓形,形狀為矩形包裹的那個圓,二維的

kCAEmitterLayerSphere:立體圓形,三維的圓形,同樣需要設(shè)置z方向數(shù)據(jù),不設(shè)置則通二維一樣

emitterMode:發(fā)射模式,這個字段規(guī)定了在特定形狀上發(fā)射的具體形式是什么

kCAEmitterLayerPoints:點模式,發(fā)射器是以點的形勢發(fā)射粒子。

如果發(fā)射形狀為:kCAEmitterLayerPoint,則發(fā)射效果為在發(fā)射點發(fā)射粒

如果發(fā)射形狀為:kCAEmitterLayerLine,則發(fā)射效果為在直線兩端都進(jìn)行粒子的發(fā)射

如果發(fā)射形狀為:kCAEmitterLayerRectangle,則發(fā)射效果為矩形的四個角

如果發(fā)射形狀為:kCAEmitterLayerCircle,則發(fā)射效果同kCAEmitterLayerPoint一樣

kCAEmitterLayerOutline: 這個模式下整個邊框都是發(fā)射點,即邊框進(jìn)行發(fā)射

如果發(fā)射形狀為kCAEmitterLayerPoint:效果就還是一個點進(jìn)行發(fā)射

如果發(fā)射形狀為kCAEmitterLayerLine:效果就是哪條直線進(jìn)行拋灑

如果發(fā)射形狀為kCAEmitterLayerRectangle:效果就是沿著那個矩形框的邊框進(jìn)行發(fā)射

如果發(fā)射形狀為kCAEmitterLayerCircle:效果就是沿著那個圓形的邊框進(jìn)行發(fā)射

效果依次如下所示:

kCAEmitterLayerSurface:這個模式下是我們邊框包含下的區(qū)域進(jìn)行拋灑

如果發(fā)射形狀為kCAEmitterLayerPoint:效果就還是一個點進(jìn)行發(fā)射

如果發(fā)射形狀為kCAEmitterLayerLine:效果就是哪條直線進(jìn)行拋灑

如果發(fā)射形狀為kCAEmitterLayerRectangle:效果就是沿著那個矩形框的內(nèi)部區(qū)域中進(jìn)行發(fā)射

如果發(fā)射形狀為kCAEmitterLayerCircle:效果就是沿著那個圓形的邊框包含的區(qū)域中進(jìn)行發(fā)射

效果依次如下所示:

kCAEmitterLayerVolume:這個的效果和kCAEmitterLayerSurface很像

上面介紹了Layer方面發(fā)射形狀、發(fā)射位置、發(fā)射模式的探索,從上面能夠大致構(gòu)建自己想要的發(fā)射形狀。下面我們就要探索拋灑的元素了CAEmitterCell相關(guān)的屬性來構(gòu)建我們想要拋灑的對象。

contents:cell的內(nèi)容,一般使用圖片,可以采用已有的或者自己繪制都可。

birthRate:出生率,這個就是代表每秒有多少個對象生成。

lifetime:生存時間,這個代表對象能夠存活的時間

lifetimeRange:生存時間浮動,這個代表生存時間會在這個數(shù)字內(nèi)浮動。比如lifetime = 10s, lifetimeRange = 5s那么實際的每個cell的lifetime = [5s - 15s]。

velocity:運動速度,這個代表粒子在拋灑中的運動速度

velocityRange:運動速度的浮動數(shù)字。同lifetimeRange的作用一樣,保證了每個粒子能夠有個隨機的速度值

yAcceleration:Y方向的加速度,這個可以模擬地球上的重力加速度,值越大則每個粒子下落的越快

velocity=40.f; yAcceleration=15.f??所有的對象都勻速運動,而且y方向有個不斷偏移的過程

velocity=40.f; velocityRange=100.f; yAcceleration=80.f?? 所有對象的速度不恒定了,且沿著y方向的偏移越發(fā)厲害了

emissionLongitude:拋灑的角度,就是指定cell從什么方向進(jìn)行拋灑

emissionRange: 拋灑角度的浮動角度,這個角度指定了拋灑出的對象能夠在多大角度范圍內(nèi)擴散。

emissionLongitude=M_PI; emissionRange=M_PI_4

emissionLongitude=0; emissionRange=M_PI_2

scale: 對象的初始縮放大小

scaleRange:對象的縮放擾動范圍

scaleSpeed: 對象縮放的速度

alphaRange:對象的透明度擾動范圍

alphaSpeed:對象的透明度的變動速度

color:對象的顏色,這里我們的cell可以對圖片從新進(jìn)行顏色的填充,所以如果對于我們設(shè)計的一個單色的圖片來說,這個字段將很有用

redRange:紅色通道的擾動范圍

greenRange:綠色通道的擾動范圍

blueRange:藍(lán)色通道的擾動范圍

redSpeed:紅色顏色的變更速度

greenSpeed:綠色顏色的變更速度

blueSpeed:藍(lán)色顏色的變更速度

我們通過上面的設(shè)置,可以產(chǎn)生隨機的顏色數(shù)值,正如我們實例中所示的那樣。需要注意的是如果我們設(shè)置了redSpeed、greenSpeed、blueSpeed的話,對象的最后顏色可能變?yōu)榱税咨蛘吆谏?/p>

redSpeed=.2f; greenSpeed=.2f; blueSpeed=.2f; 可以看到對象會很快的失去光澤。

當(dāng)然你可以對這些Layer進(jìn)行動畫,譬如position, scale, birthRate 等等。譬如以下代碼就是讓他的position隨著touch移動,以及對scale做了動畫效果。代碼如下:

而他的運行效果如下:


代碼設(shè)置/結(jié)構(gòu)說明:

1、CAEmitterCell

CAEmitterCell *effectCell = [CAEmitterCell emitterCell];

effectCell 幾個重要屬性:

1).birthRate 顧名思義沒有這個也就沒有effectCell,這個必須要設(shè)置,具體含義是每秒某個點產(chǎn)生的effectCell數(shù)量

2).lifetime & lifetimeRange 表示effectCell的生命周期,既在屏幕上的顯示時間要多長。

3).contents 這個和CALayer一樣,只是用來設(shè)置圖片

4).name這個是當(dāng)effectCell存在caeEmitter 的emitterCells中用來辨認(rèn)的。用到setValue forKeyPath比較有用

5).velocity & velocityRange & emissionRange 表示cell向屏幕右邊飛行的速度 & 在右邊什么范圍內(nèi)飛行& +-角度擴散

6).把cell做成array放進(jìn)caeEmitter.emitterCells里去。caeEmitter.renderMode有個效果很不錯,能變成火的就是kCAEmitterLayerAdditive

屬性:

alphaRange:??一個粒子的顏色alpha能改變的范圍;

alphaSpeed:粒子透明度在生命周期內(nèi)的改變速度;

birthrate:粒子參數(shù)的速度乘數(shù)因子;

blueRange:一個粒子的顏色blue?能改變的范圍;

blueSpeed:?粒子blue在生命周期內(nèi)的改變速度;

color:粒子的顏色

contents:是個CGImageRef的對象,既粒子要展現(xiàn)的圖片;

contentsRect:應(yīng)該畫在contents里的子rectangle:

emissionLatitude:發(fā)射的z軸方向的角度

emissionLongitude:x-y平面的發(fā)射方向

emissionRange;周圍發(fā)射角度

emitterCells:粒子發(fā)射的粒子

enabled:粒子是否被渲染

greenrange:?一個粒子的顏色green?能改變的范圍;

greenSpeed:?粒子green在生命周期內(nèi)的改變速度;

lifetime:生命周期

lifetimeRange:生命周期范圍

magnificationFilter:不是很清楚好像增加自己的大小

minificatonFilter:減小自己的大小

minificationFilterBias:減小大小的因子

name:粒子的名字

redRange:一個粒子的顏色red?能改變的范圍;

redSpeed;?粒子red在生命周期內(nèi)的改變速度;

scale:縮放比例:

scaleRange:縮放比例范圍;

scaleSpeed:縮放比例速度:

spin:子旋轉(zhuǎn)角度

spinrange:子旋轉(zhuǎn)角度范圍

style:不是很清楚:

velocity:速度

velocityRange:速度范圍

xAcceleration:粒子x方向的加速度分量

yAcceleration:粒子y方向的加速度分量

zAcceleration:粒子z方向的加速度分量

2、CAEmitterLayer

CAEmitterLayer提供了一個基于Core Animation的粒子發(fā)射系統(tǒng),粒子用CAEmitterCell來初始化。粒子畫在背景層盒邊界上

屬性:

birthRate:粒子產(chǎn)生系數(shù),默認(rèn)1.0;

emitterCells:裝著CAEmitterCell對象的數(shù)組,被用于把粒子投放到layer上;

emitterDepth:決定粒子形狀的深度聯(lián)系:emittershape

emitterMode:發(fā)射模式

NSString * const kCAEmitterLayerPoints;

NSString * const kCAEmitterLayerOutline;

NSString * const kCAEmitterLayerSurface;

NSString * const kCAEmitterLayerVolume;

emitterPosition:發(fā)射位置

emitterShape:發(fā)射源的形狀:

NSString * const kCAEmitterLayerPoint;

NSString * const kCAEmitterLayerLine;

NSString * const kCAEmitterLayerRectangle;

NSString * const kCAEmitterLayerCuboid;

NSString * const kCAEmitterLayerCircle;

NSString * const kCAEmitterLayerSphere;

emitterSize:發(fā)射源的尺寸大;

emitterZposition:發(fā)射源的z坐標(biāo)位置;

lifetime:粒子生命周期

preservesDepth:不是多很清楚(粒子是平展在層上)

renderMode:渲染模式:

NSString * const kCAEmitterLayerUnordered;

NSString * const kCAEmitterLayerOldestFirst;

NSString * const kCAEmitterLayerOldestLast;

NSString * const kCAEmitterLayerBackToFront;

NSString * const kCAEmitterLayerAdditive;

scale:粒子的縮放比例:

seed:用于初始化隨機數(shù)產(chǎn)生的種子

spin:自旋轉(zhuǎn)速度

velocity:粒子速度

Demo下載地址:https://pan.baidu.com/s/1jI5fdIY

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內(nèi)容