国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS實現爆炸的粒子效果示例代碼

iOS實現爆炸的粒子效果示例代碼

2021-02-04 15:19summer_liu IOS

之前在網上看到了一個Android實現的爆炸效果,感覺非常不錯,所以自己嘗試用iOS來實現下效果,現在將實現的過程、原理以及遇到的問題分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。

照例我們先看看效果圖

iOS實現爆炸的粒子效果示例代碼

怎么樣?效果很不錯吧,下面來一起看看實現的過程和代碼示例。

實現原理

從圖中可以大致看出,爆炸點點都是取的某坐標的顏色值,然后根據一些動畫效果來完成的。

取色值

怎么取的view的某個點的顏色值呢?google一下,就可以找到很多答案。就不具體說了。創建1*1的位圖,然后渲染到屏幕上,然后得到rgba。我這里寫的是uiviewextension

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
extension uiview {
 
 public func colorofpoint(point:cgpoint) -> uicolor
 {
  var pixel:[cunsignedchar] = [0,0,0,0]
 
  let colorspace = cgcolorspacecreatedevicergb()
  let bitmapinfo = cgbitmapinfo(rawvalue: cgimagealphainfo.premultipliedlast.rawvalue)
 
  let context = cgbitmapcontextcreate(&pixel, 1, 1, 8, 4, colorspace, bitmapinfo.rawvalue)
 
  cgcontexttranslatectm(context, -point.x, -point.y)
 
  self.layer.renderincontext(context!)
 
  let red: cgfloat = cgfloat(pixel[0]) / 255.0
  let green: cgfloat = cgfloat(pixel[1]) / 255.0
  let blue: cgfloat = cgfloat(pixel[2]) / 255.0
  let alpha: cgfloat = cgfloat(pixel[3]) / 255.0
 
  return uicolor(red:red, green: green, blue:blue, alpha:alpha)
 }
}

粒子的生成

這里我寫的比較簡單,就是固定每個粒子大小,根據view的寬高算出橫向,縱向的粒子數,取該點的色值,設置粒子背景色,然后生成即可。

主要代碼如下:

framedict是我預先計算好的坐標表,colordict是顏色表。以"i-j"為key

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class func createexplosionpoints(containerlayer: explosionlayer, targetview: uiview, animationtype: explosionanimationtype) {
 
  let hcount = self.caculatepointhcount(containerlayer.targetsize.width)
  let vcount = self.caculatepointvcount(containerlayer.targetsize.height)
 
  for i in 0..<hcount {
   for j in 0..<vcount {
    let key = string(format: "%d-%d", i, j)
    if let rect = containerlayer.framedict[key], color = containerlayer.colordict[key] {
 
     let layer = createexplosionpointlayer(rect, bgcolor: color, targetviewsize: containerlayer.targetsize)
 
     // animation
     layer.explosionanimation = self.createanimationwithtype(animationtype, position: layer.position, targetviewsize: containerlayer.targetsize)
 
     containerlayer.addsublayer(layer)
 
     layer.beginanimation()
    }
   }
  }
 }

動畫效果

每個粒子都有一個caanimation動畫,數據由調用者提供,靈活點。

這里定義了一個protocol:explosionanimationprotocol ,可以自定義實現了該protocol的動畫對象,提供動畫效果。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protocol explosionanimationprotocol {
 
 // 粒子初始位置
 var oldposition: cgpoint { set get }
 
 // 粒子最終位置
 var newposition: cgpoint { set get }
 
 // 縮放
 var scale: cgfloat { set get }
 
 // 動畫時長
 var duration: cftimeinterval { set get }
 
 // 動畫重復次數
 var repeatcount: float { set get }
 
 // 生成動畫
 func animation() -> caanimation
 
 // 設置動畫完之后的屬性
 func resetlayerproperty(layer: calayer)
}

要發生爆炸view的動畫效果

這個比較簡單,就是上下左右震動下。具體代碼就不貼出來了。

?
1
2
let shakeanimation = cakeyframeanimation(keypath: "position")
...

代碼結構

大致思路就是這樣。代碼結構如下:

iOS實現爆炸的粒子效果示例代碼

    explosionlayer是粒子的父容器,

    explosionpointlayer是粒子本身

    explosionhelper是個輔助類,用于計算粒子位置,顏色值。

    fallanimationupanimation是實現了explosionanimationprotocol的動畫,分別提供向下落,向上的效果。

碰到的問題

剛開始我是在邊計算顏色值,邊繪制粒子,發現會卡一下才會有爆炸效果出來,分析可能是在計算顏色值在主線程,時間較長,所以卡住了。

后來想到放到后臺線程中去做,但是在主線程中取色值的時候,后臺必須執行完,所以用了信號量來進行同步。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 震動效果
private func shake() {
 
  self.createsemaphore()
 
  // 計算位置,色值
  self.caculate()
 
  let shakeanimation = cakeyframeanimation(keypath: "position")
 
  shakeanimation.values = [nsvalue.init(cgpoint: self.position), nsvalue.init(cgpoint: cgpointmake(self.position.x, self.position.y + 1)), nsvalue.init(cgpoint: cgpointmake(self.position.x + 1, self.position.y - 1)), nsvalue.init(cgpoint: cgpointmake(self.position.x - 1, self.position.y + 1))]
 
  shakeanimation.duration = 0.2
  shakeanimation.repeatcount = 15
  shakeanimation.delegate = self
  shakeanimation.removedoncompletion = true
 
  self.targetview?.layer.addanimation(shakeanimation, forkey: "shake")
 }

當要爆炸的view開始震動時,就開始在后臺計算。震動動畫結束后,等待計算完成。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
override func animationdidstop(anim: caanimation, finished flag: bool) {
 
  // wait for caculate
  dispatch_semaphore_wait(self.semaphore!, dispatch_time_forever)
 
  print("shake animation stop")
 
  // begin explode
  if let targetview = self.targetview {
   self.parentlayer?.addsublayer(self)
   explosionhelper.createexplosionpoints(self, targetview: targetview, animationtype: self.animationtype)
 
   self.targetview?.hidden = true
  }
 }

在后續的創建粒子時,就直接從緩存中取就行了。

總結

好了,以上就是ios實現爆炸效果的全部內容了,實現后的效果是不是非常的炫酷?感興趣的朋友們快快實踐起來吧,只有自己操作了才能真正的理解,希望這篇文章對大家的學習或者工作能帶來一定的幫助。

延伸 · 閱讀

精彩推薦
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩国产欧美一区 | 精品国产欧美一区二区三区成人 | 亚洲激情在线 | 免费成人av | 青青草91在线视频 | 偷拍自拍第一页 | 亚洲视频三区 | 成人免费小视频 | 久久久嫩草 | 亚洲一区二区三区在线 | 久久国 | 日韩电影在线 | 亚洲精品久久久一区二区三区 | 黄色av网 | 国产精品色一区二区三区 | 亚洲成人免费影院 | 欧美一二三| 亚洲一区二区在线播放 | 成人黄色在线 | 综合网av| 特一级毛片 | 欧美婷婷 | 成人午夜性a一级毛片免费看 | 日韩激情 | 性网站在线 | av午夜电影| 欧美日韩一区二区三区在线观看 | 高清一区二区 | 午夜精品久久久久久久久久久久久 | 日韩午夜激情 | 精品久久久久久国产 | 成年人免费小视频 | www.黄在线看| 亚洲自拍偷拍精品视频 | 日本大人吃奶视频xxxx | 亚洲视频1| av在线日韩| 黄视频网站在线观看 | av片免费看 | 国产精品久久久久久久免费大片 | 国产精品爱久久久久久久 |