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. [python] 基于PyOD库实现数据异常检测

    PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点.异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误.噪声或潜在的有趣现象.无论是处理小规模项目还是大型 ...

  2. .Net 理解异步的学习

    // 异步 - 在方法中使用 // 异步约等于线程 async await 一起使用 // 异步只有三种返回值 // 1. Task // 2. Task<T> // 3. void 几乎 ...

  3. 默认nginx.conf

    user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid ...

  4. 云原生周刊:在 Kubernetes 集群中使用通配符证书 | 2024.2.19

    开源项目推荐 kube-fledged kube-fledged 是一个 Kubernetes Operator,用于直接在 Kubernetes 集群的工作节点上创建和管理容器映像的缓存.它允许用户 ...

  5. 字符串和json相互转换

    字符串转成json格式 JSON.parse(string) json格式转成字符串 JSON.stringify(obj) 在vue中还可以使用qs插件使用this.$qs.stringify(ob ...

  6. 微积分 Calculus

    前言 如果你的工作中没有用到微积分,毫无疑问,你的工作是简单而枯燥的. 0 limit Say there is a function \(f(x) = x\). \(x \rightarrow a\ ...

  7. golang slice相关常见的性能优化手段

    介绍一些开发中常用的slice关联的性能优化手段.鉴于golang编译器本身捉鸡的优化能力,优化的成本就得分摊在开发者自己的头上了. 这篇文章会介绍的优化手段是下面这几样: 创建slice时预分配内存 ...

  8. Linux 基础-查看进程命令 ps 和 top

    目录 1,使用 ps 命令找出 CPU 占用高的进程 2,通过 top 命令定位占用 cpu 高的进程 3,htop 系统监控与进程管理软件 4,参考资料 1,使用 ps 命令找出 CPU 占用高的进 ...

  9. 体验国产系统Deepin:很爽

    最近开始把之前一直吃亏的旧电脑拿出来再利用了,先还是选择了熟悉的ubuntu系列.安装了Ubuntu 22.04之后,风风火火地把需要的开发环境搭建起来,虽然桌面有些卡顿,但瑕不掩瑜玉.趁着热情又想着 ...

  10. 「模拟赛」多校 A 层联训 15

    比赛链接 A. 追逐游戏 (chase) 没啥意义的水题,但赛时没调出来. 分讨,LCA 设 \(S\) 和 \(T\) 的 LCA 为 \(lca\) \(S'\) 为 \(lca\) 的祖先节点的 ...