iOS 煙花撒花效果,圖層漸層,圖層倒影特效。CAEmitterLayer粒子發射器

來源:互聯網
上載者:User

iOS 煙花撒花效果,圖層漸層,圖層倒影特效。CAEmitterLayer粒子發射器
iOS 煙花撒花效果,圖層漸層,圖層倒影特效。CAEmitterLayer粒子發射器

上一節我寫了一個關於視圖圖層的相關類,有關CALayer這個類的使用和一些用法,就是我們在處理視圖的時候要對他的圖層來進行修改,需要注意的幾個地方,還有錨點的介紹,然後這篇主要說一個利用CALayer裡面的一個類來實現一個煙花的特效。

這個就是利用了CAEmitterLayer粒子發射器圖層來製作的一個效果,這個動態工具也是下面的朋友推薦的,效果很好很不錯mac版地址,就是通過一個發射點來發射一些粒子(cell)的效果。
可以通過這個圖層來“發射”一些cell,而且可以添加不同的cell,設定方向,速度等等,他也是一個繼承於CALayer的一個子類,都是對視圖的圖層做一些處理,內建動畫效果,不多說上代碼。

 @interface ViewController () @property (nonatomic ,strong)CAEmitterLayer *emitterLayer; @end - (CAEmitterLayer *)emitterLayer{      if (_emitterLayer) {         return _emitterLayer;     }      _emitterLayer = [[CAEmitterLayer alloc]init];      [self.view.layer addSublayer:_emitterLayer]; //    _emitterLayer.position = CGPointMake(200, 200);     return _emitterLayer;  }

初始一個粒子發射器對象,添加到父視圖上面。

 //使他的中心點為父視圖的中心點,   self.emitterLayer.emitterPosition = self.view.center;   self.view.backgroundColor = [UIColor blackColor]; //先設定粒子發送器的屬性 //設定粒子發送器每秒鐘發送粒子數量self.emitterLayer.birthRate = 2;//設定粒子發送器的樣式self.emitterLayer.renderMode = kCAEmitterLayerAdditive;  //初始化要發射的cell CAEmitterCell *cell = [CAEmitterCell emitterCell]; //contents:粒子的內容  cell.contents = (id)[UIImage imageNamed:@"星星"].CGImage;//他所需要物件類型的和圖層類似 //接著設定cell的屬性  //    粒子的出生量cell.birthRate = 2;  //    存活時間cell.lifetime = 3;cell.lifetimeRange = 1;   //    設定粒子發送速度   cell.velocity = 50;cell.velocityRange = 30;   //    粒子發送的方向cell.emissionLatitude = 90*M_PI/180;  //    發送粒子的加速度cell.yAcceleration = -100;  //    散發粒子的範圍  ->  弧度cell.emissionRange = 180*M_PI/180;//最後把粒子的cell添加到粒子發送器  數組內可以添加多個cell對象self.emitterLayer.emitterCells = @[cell];

它會自動給我們產生粒子(圖層)然後通過我們給它的屬性自動添加效果,發射的粒子並非是View,而只是圖層上面的一個顯示層。

然後介紹一下發射器和cell的一些屬性

1.粒子發送器圖層
- CAEmitterLayer:發送器
- 每秒發送粒子數量:birthRate

發送形狀的樣式:emitterShape
 -  CA_EXTERN NSString * const kCAEmitterLayerPoint  點 -  CA_EXTERN NSString * const kCAEmitterLayerLine   線 -  CA_EXTERN NSString * const kCAEmitterLayerRectangle  舉行 -  CA_EXTERN NSString * const kCAEmitterLayerCuboid 立方體 -  CA_EXTERN NSString * const kCAEmitterLayerCircle 曲線 -  CA_EXTERN NSString * const kCAEmitterLayerSphere 圓形
發送的樣式:emitterMode //120行開始
-  CA_EXTERN NSString * const kCAEmitterLayerPoints以點的方式  預設樣式-   CA_EXTERN NSString * const kCAEmitterLayerOutline線的樣式-   CA_EXTERN NSString * const kCAEmitterLayerSurface  以面的形式-   CA_EXTERN NSString * const kCAEmitterLayerVolume    以團的樣式
粒子出現的樣式:renderMode//點進去第129行開始
    -   CA_EXTERN NSString * const kCAEmitterLayerOldestFirst最後一個出生的粒子在第一個    -   CA_EXTERN NSString * const kCAEmitterLayerOldestLast最後出生的就在最後一個    -   CA_EXTERN NSString * const kCAEmitterLayerBackToFront把後面的放到上面    -   CA_EXTERN NSString * const kCAEmitterLayerAdditive疊加效果

在粒子發送器上面添加粒子:emitterCells

cell的一些屬性

表示粒子的是:CAEmitterCell 他不是一個Layer contents:粒子的內容 lifetime:存活時間 lifetimeRange:存活時間的範圍 birthRate:每秒的粒子產生的數量 emissionLatitude:散發的維度 他表示的是一個弧度 上下 emissionLongitude:散發的經度 ->弧度 ->左右 velocity:發送的速度 速度越快發送的越遠->動力 velocityRange:發送速度的範圍 xAcceleration; x,y,z軸的加速度 慣性 動力 yAcceleration; zAcceleration; emissionRange:散發的範圍 ->弧度 ->範圍 name:粒子的名字 可以通過名字 找到粒子

然後我們把它在加一個cell設定不同的屬性

 CAEmitterCell *cell2 = [CAEmitterCell emitterCell];     cell2.contents = (id)[UIImage imageNamed:@"點"].CGImage;//    粒子的出生量cell2.birthRate = 4;//    存活時間cell2.lifetime = 3;cell2.lifetimeRange = 1;//    設定粒子發送速度cell2.velocity = 80;cell2.velocityRange = 50;//    粒子發送的方向cell2.emissionLatitude = 90*M_PI/180;//    發送粒子的加速度cell2.yAcceleration = -100;//    散發粒子的範圍  ->  弧度cell2.emissionRange = 180*M_PI/180;//把粒子的cell添加到粒子發送器//重新設定cell的emitterCellsself.emitterLayer.emitterCells = @[cell,cell2];

為了效果我吧小紅點的出生量和初始速度設定了大了一些,在加速度相同的情況下,散發範圍相同,初始速度越大所以cell2的位移量也會大一些。發射器的渲染效果等可以自己試一下不同的樣式有什麼不同。

然後是一個圖層漸層的效果

2.漸層顏色
CAGradientLayer

可以看到這個圖層的顏色是由3種顏色的漸層色組成的,越到中心,顏色越重,越靠近邊緣顏色越淡,作為背景的效果很不錯,在這裡用到的也是CALayer的一個子類CAGradientLayer<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> CAGradientLayer *layer = [CAGradientLayer layer];layer.frame = self.view.frame; //設定顏色數組layer.colors = @[(id)[UIColor colorWithRed:1.000 green:0.377 blue:0.624 alpha:1.000].CGColor, (id)[UIColor colorWithRed:0.597 green:1.000 blue:0.657 alpha:1.000].CGColor,(id)[UIColor colorWithRed:0.649 green:0.729 blue:1.000 alpha:1.000].CGColor];

在這裡我設定了3個顏色,讓它在這三個顏色中做一個漸層的效果。所有layer的屬性他都可以使用

 //    layer.opacity = 0.7;//設定透明度可以看到背景的圖片,看上去就像一層濾鏡 //漸層的起始點layer.startPoint = CGPointMake(0, 0); //終止點layer.endPoint = CGPointMake(1, 1); //漸層的區間      顏色所在的比例,第一個在十分之二的位置,第二個在十分之五的位置,第三個在十分之八的位置//    layer.locations = @[0.2,0.5,0.8];[self.view.layer addSublayer:layer];

當我設定了他的起始點為左上方,終止點為右下角的時候,他就變成了這樣的一個效果。這個效果作為處理圖層的效果很不錯,有相當於濾鏡的效果,不過兩者還是有不同,濾鏡是給圖片增加特效,這個是給圖層增加特效。

這個類只有這麼多屬性,使用起來也比較簡單,效果也很不錯。

在接下來說一個倒影的效果,類似鏡像的特效

3.複製圖層CAReplicatorLayer

複製圖層的意思就是把這個圖層拷貝一份然後給他增加效果,做一些transform的改變

複製圖層重要的一點,如果要使用複製圖層,必須重寫視圖 layerClass 把原有的CALayer修改成CAReplicatorLayer

就是說要使用CAReplicatorLayer的視圖必須重寫它的layerClass方法才能使用CAReplicatorLayer複製圖層。

先看一下效果

可以看到它就是原圖層的一個鏡像,顏色什麼的相對淡了一些,當然這都是我們給它的鏡像(複製)的一些效果。接下來看是怎麼使用的。

1.重寫視圖的layerClass方法
????????????
首先我們建立一個UIView的類,重寫他的方法,第一步非常重要,如果不重寫這個方法,視圖的初始化都不會有效果。

首先自訂一個類,就先命名為CanReplicatorView,繼承與UIView

然後重寫他的方法,在.M裡面

  //只有這一步才能複製視圖上面的layer   //要想賦值視圖的圖層就必須重寫這個視圖的layerClass   + (Class)layerClass{      return [CAReplicatorLayer class];  }

2.初始化視圖

CanReplicatorView *repView = [[CanReplicatorView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];

//寫一個我們要顯示圖片的視圖添加上去
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.image = [UIImage imageNamed:@”屠龍刀”];

3.初始化複製圖層

CAReplicatorLayer layer = (CAReplicatorLayer )repView.layer;

//給複製圖層定義屬性
//instanceCount layer的執行個體化數量 必須明確複製幾份
layer.instanceCount = 2;//寫個2就複製出來了1份,加上原圖一共有2份了

4.給複製視圖設定transform值

//instanceTransform表示複製圖層的樣式 Transform是原視圖的樣式
//定義一個讓視圖向下平移400的transform值
CATransform3D transform = CATransform3DMakeTranslation(0, 400, 0);
//讓視圖向下便宜400並旋轉180度,成倒影狀
layer.instanceTransform = CATransform3DRotate(transform, 180*M_PI/180, 1, 0, 0);

// 還可以設定顏色的位移量 透明度等
layer.instanceRedOffset = -0.2;//紅色位移量
layer.instanceBlueOffset = -0.2;//藍色
layer.instanceGreenOffset = -0.2;//綠色
layer.instanceAlphaOffset = -0.4;//透明度位移量

5.添加視圖
[self.view addSubview:repView];
//把顯示圖片的視圖添加到我們的可以使用複製圖層的視圖上
[repView addSubview:imageView];

通過這三個效果可以讓視圖有各種效果,我們改變的只是圖層,並非視圖的屬性,給他們的圖層添加了一些特效,在使用的時候讓視圖更加美觀,也是iOS裡面內建的一些處理效果。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.