- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章iOS实现爆炸的粒子效果示例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
照例我们先看看效果图 。
怎么样?效果很不错吧,下面来一起看看实现的过程和代码示例.
实现原理 。
从图中可以大致看出,爆炸点点都是取的某坐标的颜色值,然后根据一些动画效果来完成的.
取色值 。
怎么取的view的某个点的颜色值呢?google一下,就可以找到很多答案。就不具体说了。创建1*1的位图,然后渲染到屏幕上,然后得到rgba。我这里写的是uiview的extension.
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"
)
...
|
代码结构 。
大致思路就是这样。代码结构如下:
explosionlayer是粒子的父容器, 。
explosionpointlayer是粒子本身 。
explosionhelper是个辅助类,用于计算粒子位置,颜色值.
fallanimation,upanimation是实现了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实现爆炸效果的全部内容了,实现后的效果是不是非常的炫酷?感兴趣的朋友们快快实践起来吧,只有自己操作了才能真正的理解,希望这篇文章对大家的学习或者工作能带来一定的帮助.
最后此篇关于iOS实现爆炸的粒子效果示例代码的文章就讲到这里了,如果你想了解更多关于iOS实现爆炸的粒子效果示例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!