[Perk]如何实现波浪效果(Swift)
来源:互联网 发布:会声会影 mac版 编辑:程序博客网 时间:2024/05/24 02:38
首先,还是先来看看要实现的效果:
没错,现在很多App中都有这种效果,比如给你显示剩余电量啊,流量啊什么的。一直想看看这种效果怎么实现的,看了一个Demo,瞬间明白,来,我们一步步实现一下,首先分析下实现的思路:
1.其实波浪曲线是一条正弦曲线;
2.如何画出这条曲线呢?利用CAShapeLayer
和UIBezierPath
画线就行了;
3.画出曲线来了过后,如何让这个曲线动起来呢?无非就是让这条正弦曲线不停的移动嘛,难道你还真以为像波浪一样波涛起伏啊,佛曰:都是假象!其实是这里是利用了CADisplayLink
来以和屏幕同步刷新让正弦曲线移动达到这种效果;
看了思路,可能天赋异禀的大猿们已经会了,不会的童鞋也不用着急,听我给你细细道来。
我们先来回顾下高中数学:正弦曲线y = h * sin(a * x + b)
的特点。
用Mac自带的Grapher软件,我们可以看到以下几条曲线是这样的:
y = sinx
y = 2sinx
y = 2sin2x
y = 2sin(2x+2)
看了上面那几条曲线,是不是顿悟?我们发现h便是波浪高度的一半(这个叫振幅是吧?忘了~),h越大,波浪越高;a便是波的宽度,a小于1时越小,波越宽;a越大,波越窄;b便是波的左右移动了,至于移多快,由你来决定;所以,我们所有做的就是让a值小一点,h也小一点,至于b,看你自己了。
曲线模型我们现在有了,怎么把它画出来呢;实际上整个波浪是个这样的图形:
所以我们要把整个图形画出来,曲线只是bc段,用什么画呢?这里我用的UIBezierPath
,你当然也可以用CGPath
来画,但是对于我个人来说,能用高级API尽量不用底层的API。这里不去深究,看个人喜好。我们先把画笔移动到a点,然后bc段通过正弦曲线来画,最后画到d点然后封闭图形,这就成了波浪的图形。然后再把这个图形,赋值给CAShapeLayer
就拿到了我们这个图形了。(关于CAShapeLayer
请移步:https://zsisme.gitbooks.io/ios-/content/chapter6/cashapelayer.html)
func wave() {// 从左下角开始 let realPath = UIBezierPath() realPath.moveToPoint(CGPoint(x: 0, y: frame.size.height)) let maskPath = UIBezierPath() maskPath.moveToPoint(CGPoint(x: 0, y: frame.size.height)) var x = CGFloat(0) var y = CGFloat(0) while x <= bounds.size.width { // 波浪曲线 y = waveHeight * sin(x * waveRate + offset) realPath.addLineToPoint(CGPoint(x: x, y: y)) maskPath.addLineToPoint(CGPoint(x: x, y: -y)) // 增量越小,曲线越平滑 x += 0.1 } // 回到右下角 realPath.addLineToPoint(CGPoint(x: frame.size.width, y: frame.size.height)) maskPath.addLineToPoint(CGPoint(x: frame.size.width, y: frame.size.height)) // 闭合曲线 maskPath.closePath() // 把封闭图形的路径赋值给CAShapeLayer maskWaveLayer?.path = maskPath.CGPath maskWaveLayer?.fillColor = maskWaveColor.CGColor realPath.closePath() realWaveLayer?.path = realPath.CGPath realWaveLayer?.fillColor = realWaveColor.CGColor}
上面便是波浪效果的核心代码了,这是光是如此,波浪自然是不会动的了。要让波浪起伏起来,我们需要不断偏移曲线,所以此时b就派上了用场,也就是代码里的offset
。所以我们只需要在该函数开头加上以下代码, 并把该函数放入CADisplayLink
中,便完成了波浪效果了。
// 波浪移动的关键:按照指定的速度偏移 offset += waveSpeed…………displayLink = CADisplayLink(target: self, selector: #selector(self.wave)) displayLink!.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes);
怎么样?还挺简单的吧。至于其他封装,便看具体需求和你自己的习惯了。完整的代码请移步GitHub:https://github.com/iDustPan/TheWaveEffect
- [Perk]如何实现波浪效果(Swift)
- [Perk]如何实现粒子效果
- WPF 实现波浪浮动效果
- Android实现波浪效果 - WaveView
- 百度外卖-- 波浪效果实现
- 纯 CSS 实现波浪效果!
- 使用js实现文字波浪效果
- html5Canvas动画实现球内波浪效果
- Unity用Shader实现波浪效果
- Android实现波浪动画效果(Bezier)
- Android中实现波浪球效果
- Android实现波浪效果,带百分比进度
- unity海边波浪效果的实现
- Android贝塞尔曲线-波纹(波浪)效果
- 使用CSS3线性渐变(linear-gradient)实现文本波浪线效果
- Swift 波浪动画
- SWT实现的图片加扭曲、波浪效果
- 【FLEX】实现音频播放的波浪效果【转】
- oracle substr,substrb ,instr,instrb函数的用法以及like的优化
- 【Linux网络编程】原始套接字实例:MAC 头部报文分析
- 重载求最大值
- Android反编译工具Android Killer
- JAVA多线程(1)
- [Perk]如何实现波浪效果(Swift)
- smarty模板引擎--php高级最详细教程
- 异常解决方案
- Linux命令练习第二关(5)
- 水题-Codeforces Round #369 Div.2-A
- 数组的逆序输出
- linux学习之正则表达式
- String知识点
- 使用phonegap操作数据库