IOS实现水波纹

需要实现一个水波纹效果

其实就是画两个正弦函数或者余弦函数的layer在view上面,根据屏幕刷新率来重绘,更新其左右偏移量来让其看起来是在左右移动

具体实现

  1. 定义两个layer,用不同的颜色填充
    lazy var frontLayer: CAShapeLayer = {
let tempV = CAShapeLayer()
tempV.fillColor = frontColor.cgColor
return tempV
}() lazy var backLayer: CAShapeLayer = {
let tempV = CAShapeLayer()
tempV.fillColor = backColor.cgColor
return tempV
}()
  1. 通过CADisplayLink来保持和屏幕相同的刷新率
    lazy var displayLink: CADisplayLink = {
let tempV = CADisplayLink(target: self, selector: #selector(updateWave))
return tempV
}() displayLink.add(to: RunLoop.main, forMode: .common)

CADisplayLink其实也就是一个和屏幕刷新频率相同的Timer,在每次屏幕刷新的时候就会调用传进去的Selector,初始化完成后需要通过.add方法加入到Runloop中

不用时销毁,调用invalidate()方法

displayLink.invalidate()

  1. 更新layer

在更新layer的updateWave方法中将我们的线条画出来

复习一下正弦函数公式

y=Asin(ωx+φ)+ b

其中

  • A: 曲线的振幅,曲线最高位和最低位的距离
  • ω: 曲线的角速度,用于控制周期大小,越大宽越小
  • φ: 曲线的初相,决定X轴的偏移量
  • b: 曲线的偏距,决定Y轴的偏移量

在代码中

    /// 速度
var speed: CGFloat = 0.01 /// 振幅,曲线最高位和最低位的距离
var amplitude: CGFloat = 10.0 /// 初相,曲线左右偏移量
var offsetX: CGFloat = 0.0 /// 角速度,用于控制周期大小,单位x中起伏的个数
var angularVelocity: CGFloat = 1.0 /// Y轴偏移量,偏距,曲线上下偏移量
var offsetY: CGFloat = 0.0

以前面这个layer为例

        // 创建一个路径
let firstPath = CGMutablePath()
var firstY = bounds.size.width / 2
firstPath.move(to: CGPoint(x: 0, y: firstY))
for x in 0...Int(bounds.size.width) {
firstY = amplitude * sin(angularVelocity * CGFloat(x) + offsetX) + offsetY
firstPath.addLine(to: CGPoint(x: CGFloat(x), y: firstY))
} firstPath.addLine(to: CGPoint(x: bounds.size.width, y: bounds.size.height))
firstPath.addLine(to: CGPoint(x: 0, y: bounds.size.height))
firstPath.closeSubpath()
frontLayer.path = firstPath

从0到以要绘制的宽度循环,绘制每一个像素点

updateWave方法中增加X轴偏移量,使其看起来在横向移动

offsetX += speed

第二个函数图像在增加X轴偏移量时和第一个区别一下,具体的细节调整可以根据需求来

效果图

IOS实现水波纹的更多相关文章

  1. iOS 自定义任意形状加载进度条(水波纹进度条)

    1. 项目中要做类似下面的加载动画: 先给出安卓的实现方式 2.iOS的实现方式参考了下面两位的,感谢. 以任意底部图片为背景的加载动画 和 水波纹动画 最后附上自己的demo

  2. 适配移动端的在图片上生成水波纹demo

      <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&q ...

  3. jquery ripples水波纹效果( 涟漪效果)

    这个效果是我从bootstrap-material-design上面分离下来的,bootstrap-material-design的一些组件样式我不太不喜欢,但是非常喜欢这个水波纹效果,所以就有了这篇 ...

  4. 如何使用 HTML5 Canvas 制作水波纹效果

    今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javasc ...

  5. 兼容Android的水波纹效果

    Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...

  6. android自定义控件(4)-自定义水波纹效果

    一.实现单击出现水波纹单圈效果: 照例来说,还是一个自定义控件,观察这个效果,发现应该需要重写onTouchEvent和onDraw方法,通过在onTouchEvent中获取触摸的坐标,然后以这个坐标 ...

  7. android 5.0 水波纹 实现

    1. 定义一个普通圆角背景的xml; rounded_corners.xml <?xml version="1.0" encoding="utf-8"?& ...

  8. VC_MFC水波纹控件,开源

    代码和效果图: https://github.com/wjx0912/MfcWaterEffect 集成以下5个文件即可: watereffect\DIB.hwatereffect\DIB.cppwa ...

  9. 自定义view实现水波纹效果

    水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...

  10. C++实现水波纹、火焰和血浆效果

    点击这里查看原文 Code Project着火了! 整个工程有三个类,它们可以让你在图象上添加一些很酷的效果. 我把这些文件都放到我的代码压缩包里面了,并且做了一个小工程来让一些人使用起来更方便,但是 ...

随机推荐

  1. LeetCode 650. 2 Keys Keyboard(只有两个键的键盘)(DP/质因数分解)

    最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). Paste (粘贴) : ...

  2. SVN(Linux)提交时强制写日志

    SVN(Linux)提交时强制写日志 1.创建并修改pre-commit文件 进入svn/code/hooks目录,在svn版本库的hooks文件夹下面,复制模版pre-commit.tmplcp p ...

  3. 2022年1月国产数据库排行榜:TiDB霸榜两年势头不减,openGauss与OceanBase分数大涨

    奎钩粲粲光华动,群玉森森气象新.国产数据库行业在经历了2021年的躬行实践之后,产品.服务.生态等取得了蓬勃发展.从2022年1月份的国产数据库流行度排行榜上,我们可以看到,相较于去年12月份,榜单上 ...

  4. KubeSphere 部署 Zookeeper 实战教程

    前言 知识点 定级:入门级 如何利用 AI 助手辅助运维工作 单节点 Zookeeper 安装部署 集群模式 Zookeeper 安装部署 开源应用选型思想 实战服务器配置(架构 1:1 复刻小规模生 ...

  5. 云原生爱好者周刊:使用树莓派组建 K8s 集群 | 2022-08-08

    开源项目推荐 Raspberry Pi Kubernetes Cluster 这是一个教育项目,旨在探索如何在家中使用树莓派构建 Kubernetes 集群,并使用 Ansible 来自动化部署和配置 ...

  6. Saas多租户数据权限设计(参考RuoYi)

    导航 引子 场景梳理 基于角色的访问控制(RBAC) 多租户系统的权限设计 RuoYi系统的数据权限设计 最终设计方案 参考 本文首发<智客工坊-Saas多租户数据权限设计(参考RuoYi)&g ...

  7. 自如月租计算 ziroom

    前言 自如的房子月租看似不高,实际上它是收中介费的,加上中介费和未满一年的押金,房租其实非常高. 普通中介费一般收1个月,自如的中介费美名其曰服务费(除了网费想不到有什么用的),一年为1.2个月租金. ...

  8. python项目实战——人生重开模拟器

    文章目录 1.菜单栏的编写 2.玩家确定颜值.体质.智力.家境 3.生成性别 4.设定角色出生点 5.各个年龄段的变化 5.1 幼年阶段 5.2 青年阶段 5.3中年阶段 5.4 晚年阶段 6.整体代 ...

  9. [rCore学习笔记 031] SV39多级页表的硬件机制

    看到这个题目就知道上一节提到的RISC-V手册的10.6节又有用武之地了. 这里只需注意,RV32 的分页方案Sv32支持4GiB的虚址空间,RV64 支持多种分页方案,但我们只介绍最受欢迎的一种,S ...

  10. PHP调用Python无返回或提示No Module

    问题:自己通过命令行执行python正常,但通过php调用就没有反应.解决方法:1.首先检查一下php有没有执行权限,简单粗暴的:sudo chmod 777 xxx.php2.Python如果有中文 ...