首页 > 其他分享 >IOS实现水波纹

IOS实现水波纹

时间:2023-04-05 14:11:05浏览次数:39  
标签:水波纹 实现 IOS 偏移量 firstPath tempV var size CGFloat

IOS实现水波纹

需要实现一个水波纹效果

RPReplay_Final1679274469

其实就是画两个正弦函数或者余弦函数的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轴偏移量时和第一个区别一下,具体的细节调整可以根据需求来

效果图

RPReplay_Final1679275628

标签:水波纹,实现,IOS,偏移量,firstPath,tempV,var,size,CGFloat
From: https://www.cnblogs.com/r1cardo/p/17289356.html

相关文章

  • IOS颜色选择器
    IOS颜色选择器UIColorWellUIColorWell是一个继承UIControl的视图,它不能调整大小和UISwitch类似,大小大约是44*44。点击可弹出一个选择颜色的弹窗因为是继承UIControl所以可以添加UIControlEventValueChanged类型的Event事件去监听颜色改变///Setstheselectedcoloron......
  • 在windows下通过xshell来实现跳板机配置pycharm环境和xftp文件访问
    xshell实现跳板机先使用xshell实现跳板机,并将对应的跳板机窗口打开。跳板机使用xshell的隧道功能实现,选择作为中转的服务器B的属性。选择隧道选择添加侦听端口为本机A的,后面通过localhost:7777进行访问。这个端口可以自己设置不同的。目标主机就是通过服务器B作为跳板机,要......
  • 单臂路由实现VLAN间通信
    VLAN间通信 1、一个VLAN的单播、组播、广播不会进入另一个VLAN;2、VLAN之间的通信需要借助于三层的路由功能来实现。 不合理的直连路由 1、与多少个VLAN连接,路由器就需要提供多少个以太网接口,每个接口连接一个VLAN;2、连接哪个VLAN,该路由器接口就配置这个VLAN的一个IP地址,作为这......
  • 三层交换机实现VLAN间的通信
    VLAN间通信方法 1、一个VLAN的单播、组播、广播不会进入另一个VLAN;2、VLAN之间的通信需要借助于三层的路由功能来实现。 单臂路由 三层交换机 1、三层交换机是二层交换机与三层功能的一个有机结合,使交换机既具有交换功能又具有路由功能;  2、同一个VLAN的计算机之间通信只......
  • 怎么利用CSS实现HTML5响应式导航栏
    在html5中实现响应式导航栏的方法有很多种,如何利用纯CSS来现实这一功能,在这里小编就通过实例来和大家讲解,纯CSS实现的HTML5响应式导航栏的方法和技巧。目前响应试web页面已经逐渐开始盛行,除了将页面的内容以及布局结构实现响应试以外,剩下的重点就是实现导航栏的响应试,当然方法有很......
  • springboot +vue2.x实现音乐网站
    1pom文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache......
  • c++实现Matlab矩阵Matrix类(实矩阵Matrix、复矩阵CMatrix)
    全栈工程师开发手册(作者:栾鹏)matlab2c动态链接库下载matlab库函数大全matlab2c基础教程matlab2c开发全解教程开发注意事项:1、目前matlab2c对矩阵的实现仅包含实数型、复数型数据。实数型矩阵使用Matrix定义,复数型矩阵使用CMatrix定义。2、实数矩阵元素int、float元素类型会自动......
  • 黑马程序员高端iOS培训:苹果一条公告搅混了大家的脑洞
         正文前面,先说点正经的。苹果公司在北京时间8月30日凌晨正式向媒体发出邀请函,宣布将于北京时间9月8日凌晨1点在旧金山的比尔-格雷厄姆市政礼堂举行苹果秋季新品发布会。此次邀请函的主题为“Seeyouonthe7th”。     正经的说完了,不正经的要开始说了。或许是天......
  • JS实现自动倒计时30秒后按钮才可用
    WEB开发中经常会用到倒计时来限制用户对表单的操作,比如希望用户在一定时间内看完相关协议信息才允许用户继续下一步操作,又比如在收取手机验证码时允许用户在一定时间过后(未收到验证码的情况下)再次获取验证码。那么今天我来给大家介绍下如何使用Javascript来实现这一简单应用。应......
  • 细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现
    1.前文回顾在之前的几篇内存管理系列文章中,笔者带大家从宏观角度完整地梳理了一遍Linux内存分配的整个链路,本文的主题依然是内存分配,这一次我们会从微观的角度来探秘一下Linux内核中用于零散小内存块分配的内存池——slab分配器。在本小节中,笔者还是按照以往的风格先带......