[Perk]如何实现波浪效果(Swift)

原创 2016年08月30日 22:30:51

首先,还是先来看看要实现的效果:

波浪效果

没错,现在很多App中都有这种效果,比如给你显示剩余电量啊,流量啊什么的。一直想看看这种效果怎么实现的,看了一个Demo,瞬间明白,来,我们一步步实现一下,首先分析下实现的思路:

1.其实波浪曲线是一条正弦曲线;
2.如何画出这条曲线呢?利用CAShapeLayerUIBezierPath 画线就行了;
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

版权声明:本文为博主原创文章,转载请著名出处。

(Swift+iOS)字符串轨迹转贝塞尔曲线,实现动态写字效果

前两天下载了一个Swift的HUD提示效果,偶然发现其中的提示效果上面的文字是动态书写的。感觉挺不错的,代码地址如下: http://code.cocoachina.com/view/129442。...
  • longitachi
  • longitachi
  • 2016年02月26日 10:46
  • 3464

Swift的动态性

动态性比较重要的一点就是能够拿到某个类所有的方法、属性,我们使用如下代码来打印方法和属性列表。 纯Swift类的函数调用已经不再是Objective-c的运行时发消息,而是类似C...
  • smnisbear
  • smnisbear
  • 2016年04月16日 19:38
  • 1110

WPF里的一些Effect特效

Blend的特效都在Microsoft.Expression.Media.Effects里,用之前添加一下引用。 可以在前台选中对象后直接点击Effect新建一种特效,也可以在后台设置。 eg:T...
  • wushang923
  • wushang923
  • 2012年02月07日 11:52
  • 8351

好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效按钮

我们先来看看Quartz MS字体动态显示系统时间的效果,难度相较于上一篇也要简单许多。首先是定义一个TextBlock如下。 ...
  • NoMasp
  • NoMasp
  • 2015年06月11日 15:09
  • 6501

Swift基础之显示波纹样式

最近项目用到了蓝牙连接,搜索设备的内容,其中需要搜索过程中出现波纹的动画效果,在这里将项目中OC语言编写的这种动画效果,转换成Swift编写,下面简单介绍说明一下代码。这里用到了两种方法实现波纹效果,...
  • hbblzjy
  • hbblzjy
  • 2016年09月15日 22:16
  • 741

iOS贝塞尔曲线,折线,曲线,波浪线

接口调用简单, 可以调整线的弯曲程度, 可以在线上显示数据点 demo下载地址 http://download.csdn.net/detail/dylan_lwb_/8838909...
  • dylan_lwb_
  • dylan_lwb_
  • 2015年06月25日 17:46
  • 3658

[Perk]如何实现波浪效果(Swift)

首先,还是先来看看要实现的效果:没错,现在很多App中都有这种效果,比如给你显示剩余电量啊,流量啊什么的。一直想看看这种效果怎么实现的,看了一个Demo,瞬间明白,来,我们一步步实现一下,首先分析下实...
  • xupan1992
  • xupan1992
  • 2016年08月30日 22:30
  • 483

波浪线动画

类似淘宝个人信息状态栏,京东金融等双波浪动画 主要方法:通过自定义View,利用正弦函数与余弦函数的效果. 一.相关概念解释 正弦函数: y =Asin(ωx+φ)+C A 表...
  • u012907783
  • u012907783
  • 2018年02月02日 18:28
  • 17

纯 CSS 实现波浪效果!

而使用纯 CSS 的方式,实现贝塞尔曲线,额,暂时是没有很好的方法。     当然,借助其他力量(SVG、CANVAS),是可以很轻松的完成所谓的波浪效果的,先看看,非 CSS 方式实现的波浪效果。...
  • diaoleiluomulaojin
  • diaoleiluomulaojin
  • 2017年08月07日 16:48
  • 237

[Android UI] 波浪特效的实现

本文目标是实现一个可自定义的波浪特效。先看效果:相关知识点: canvas绘图、BitmapShader、PorterDuff.Mode.SRC_ATOP。思路: 1.准备两张图,一张为图案,一张...
  • hackooo
  • hackooo
  • 2015年11月07日 19:09
  • 1772
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Perk]如何实现波浪效果(Swift)
举报原因:
原因补充:

(最多只允许输入30个字)