一
最近直播類型的軟件挺流行的默刚,然后發(fā)現(xiàn)了一個(gè)這樣的粒子效果挺有趣的附鸽,決定實(shí)踐下
這個(gè)不算盜圖吧
先說(shuō)實(shí)現(xiàn)這種效果的步驟悼嫉,很簡(jiǎn)單,主要分三部:
1,設(shè)置CAEmitterLayer發(fā)射器
2,設(shè)置CAEmitterCell粒子效果
3,添加到需要顯示的Layer上
二
先說(shuō)下CAEmitterLayer,文檔上是這樣介紹的
粒子發(fā)射層,每一個(gè)發(fā)生器都有一個(gè)Cells數(shù)組,這些定義了粒子怎么被發(fā)射出去和如何展示在層上.
粒子系統(tǒng)受層同步影響.模擬行為于成都開始時(shí)間啟動(dòng).
粒子會(huì)畫在背景色和層的邊框之上.
看下他的幾個(gè)屬性:
//附屬在層上的粒子數(shù)組坑填,每一個(gè)對(duì)象必須是CAEmitterCell的子類
@property(nullable, copy) NSArray<CAEmitterCell *> *emitterCells;
//每一個(gè)cell的初始速度是由該數(shù)字乘以給定的每秒創(chuàng)建粒子的數(shù)量,默認(rèn)值是1/s
@property float birthRate;
//cell生命周期是由該數(shù)字乘以粒子什么時(shí)候創(chuàng)建弛姜,默認(rèn)是1s
@property float lifetime;
//發(fā)射器的中心位置脐瑰,默認(rèn)是(0,0,0)
@property CGPoint emitterPosition;
@property CGFloat emitterZPosition;
//發(fā)射器的大小,默認(rèn)是(0, 0, 0).依靠‘ emitterShape’屬性娱据,一些值可能會(huì)被忽略
@property CGSize emitterSize;
//發(fā)射器的深度蚪黑,有時(shí)可能會(huì)產(chǎn)生立體效果
@property CGFloat emitterDepth;
//一個(gè)定義好的發(fā)射器形狀的字符串,當(dāng)前可選有'point' (默認(rèn)), `line', `rectangle', `circle', `cuboid' 和 `sphere'.
@property(copy) NSString *emitterShape;
//一個(gè)定義好的字符串,表示粒子相對(duì)發(fā)射器怎么被創(chuàng)建中剩,當(dāng)前可選有`points', `outline', `surface' 和 `volume' (默認(rèn)).
@property(copy) NSString *emitterMode;
//一個(gè)定義了發(fā)射渲染模式的字符串忌穿,當(dāng)前可選的有 `unordered' (默認(rèn)), `oldestFirst', `oldestLast', `backToFront' (i.e. sorted into Z order) and `additive'. 前四個(gè)是使用源在合成,最后一個(gè)是各種模式的混合
@property(copy) NSString *renderMode;
//是否開啟三維空間模式
@property BOOL preservesDepth;
//粒子的移動(dòng)速度,默認(rèn)是1
@property float velocity;
//粒子的縮放大小,默認(rèn)是1
@property float scale;
/* Multiplies the cell-defined particle spin. Defaults to one. Animatable. */
//粒子的旋轉(zhuǎn)角度
@property float spin;
//用來(lái)生成隨機(jī)因子的初始化種子结啼,默認(rèn)是0掠剑,每一個(gè)層都有一個(gè)他自己的RNG狀態(tài),具有一個(gè)平均值M和范圍值R郊愧,取值范圍在[M - R/2, M + R/2]之間朴译。
@property unsigned int seed;
定義好的字符串類型
/** `發(fā)射器形狀取值' values. **/
CA_EXTERN NSString * const kCAEmitterLayerPoint
//從一個(gè)點(diǎn)發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerLine
//沿一條線發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerRectangle
//從一個(gè)矩形發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerCuboid
//從一個(gè)立方體發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerCircle
//從一個(gè)圓形中發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerSphere
/** `發(fā)射器發(fā)射模式' values. **/
CA_EXTERN NSString * const kCAEmitterLayerPoints
//從發(fā)射器中發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerOutline
//從發(fā)射器輪廓發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerSurface
//從發(fā)射器表面發(fā)出
CA_EXTERN NSString * const kCAEmitterLayerVolume
//從發(fā)射器中點(diǎn)發(fā)出
/** `發(fā)射器渲染模式' values. **/
CA_EXTERN NSString * const kCAEmitterLayerUnordered
//無(wú)序
CA_EXTERN NSString * const kCAEmitterLayerOldestFirst
//最久的在最上面
CA_EXTERN NSString * const kCAEmitterLayerOldestLast
//最久的在最下面
CA_EXTERN NSString * const kCAEmitterLayerBackToFront
//按照Z(yǔ)軸,由后到前
CA_EXTERN NSString * const kCAEmitterLayerAdditive
//混合模式
NS_ASSUME_NONNULL_END
二
說(shuō)完粒子發(fā)射器属铁,接下來(lái)聊聊粒子
這東西是一個(gè)遵循了CAMediaTiming協(xié)議的對(duì)象
//類方法的方式創(chuàng)建一個(gè)粒子
+ (instancetype)emitterCell;
//粒子實(shí)現(xiàn)繼承自CALayer的相同屬性
+ (nullable id)defaultValueForKey:(NSString *)key;
- (BOOL)shouldArchiveValueForKey:(NSString *)key;
//粒子的名字,來(lái)實(shí)現(xiàn)鍵值匹配
@property(nullable, copy) NSString *name;
//控制是否打開粒子渲染效果
@property(getter=isEnabled) BOOL enabled;
//粒子的初始速度
@property float birthRate;
//粒子的生命周期和時(shí)間容差,默認(rèn)都是0
@property float lifetime;
@property float lifetimeRange;
//設(shè)置粒子的在xy平面軸和z軸的發(fā)射角度
@property CGFloat emissionLatitude;
@property CGFloat emissionLongitude;
//粒子發(fā)射角度的范圍
@property CGFloat emissionRange;
//粒子的速度和速度范圍
@property CGFloat velocity;
@property CGFloat velocityRange;
//x眠寿,y,z軸方向上的加速度
@property CGFloat xAcceleration;
@property CGFloat yAcceleration;
@property CGFloat zAcceleration;
//粒子的縮放焦蘑,縮放范圍盯拱,縮放速度
@property CGFloat scale;
@property CGFloat scaleRange;
@property CGFloat scaleSpeed;
//旋轉(zhuǎn)角度和角度范圍
@property CGFloat spin;
@property CGFloat spinRange;
//每一個(gè)粒子的平均顏色,和顏色范圍
@property(nullable) CGColorRef color;
@property float redRange;
@property float greenRange;
@property float blueRange;
@property float alphaRange;
/* The speed at which color components of emitted objects change over
* their lifetime, defined as the rate of change per second. Defaults
* to (0, 0, 0, 0). Animatable. */
@property float redSpeed;
@property float greenSpeed;
@property float blueSpeed;
@property float alphaSpeed;
//是一個(gè)CGImageRef類型的內(nèi)容
@property(nullable, strong) id contents;
//內(nèi)容大小
@property CGRect contentsRect;
//內(nèi)容縮放程度
@property CGFloat contentsScale;
//內(nèi)容的縮小或放大濾鏡
@property(copy) NSString *minificationFilter;
@property(copy) NSString *magnificationFilter;
@property float minificationFilterBias;
//一個(gè)包含子粒子的粒子數(shù)組
@property(nullable, copy) NSArray<CAEmitterCell *> *emitterCells;
//設(shè)置粒子的樣式
@property(nullable, copy) NSDictionary *style;
三
解釋了這么多文檔上的內(nèi)容例嘱,下面說(shuō)展示下效果
最終效果1
最終效果2
四
最后放代碼
點(diǎn)我點(diǎn)我快點(diǎn)我