IOS实现水波纹
IOS实现水波纹
需要实现一个水波纹效果

其实就是画两个正弦函数或者余弦函数的layer在view上面,根据屏幕刷新率来重绘,更新其左右偏移量来让其看起来是在左右移动
具体实现
- 定义两个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
}()
- 通过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()
- 更新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实现水波纹的更多相关文章
- iOS 自定义任意形状加载进度条(水波纹进度条)
1. 项目中要做类似下面的加载动画: 先给出安卓的实现方式 2.iOS的实现方式参考了下面两位的,感谢. 以任意底部图片为背景的加载动画 和 水波纹动画 最后附上自己的demo
- 适配移动端的在图片上生成水波纹demo
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&q ...
- jquery ripples水波纹效果( 涟漪效果)
这个效果是我从bootstrap-material-design上面分离下来的,bootstrap-material-design的一些组件样式我不太不喜欢,但是非常喜欢这个水波纹效果,所以就有了这篇 ...
- 如何使用 HTML5 Canvas 制作水波纹效果
今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javasc ...
- 兼容Android的水波纹效果
Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...
- android自定义控件(4)-自定义水波纹效果
一.实现单击出现水波纹单圈效果: 照例来说,还是一个自定义控件,观察这个效果,发现应该需要重写onTouchEvent和onDraw方法,通过在onTouchEvent中获取触摸的坐标,然后以这个坐标 ...
- android 5.0 水波纹 实现
1. 定义一个普通圆角背景的xml; rounded_corners.xml <?xml version="1.0" encoding="utf-8"?& ...
- VC_MFC水波纹控件,开源
代码和效果图: https://github.com/wjx0912/MfcWaterEffect 集成以下5个文件即可: watereffect\DIB.hwatereffect\DIB.cppwa ...
- 自定义view实现水波纹效果
水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...
- C++实现水波纹、火焰和血浆效果
点击这里查看原文 Code Project着火了! 整个工程有三个类,它们可以让你在图象上添加一些很酷的效果. 我把这些文件都放到我的代码压缩包里面了,并且做了一个小工程来让一些人使用起来更方便,但是 ...
随机推荐
- 4Templates Bootstrap Navbars and Links
链接 传递参数
- MySQL9的3个新特性
本文讲解MySQL9的3个新特性:支持将JSON输出保存到用户变量.支持准备语句以及支持面向AI的向量存储. 17.12 MySQL9新特性1--支持将JSON输出保存到用户变量 从MySQL 9版 ...
- CMake 属性之全局属性
[写在前面] CMake 的全局属性是指在 CMake 配置过程中,对整个项目范围生效的设置. 这些属性不同于目标 ( Target ) 属性或目录 ( Directory ) 属性,后者仅对特定的目 ...
- markdown.css 设置文章的样式
返回的详情文章内容是标签加内容文字,使用 markdown,css 渲染样式 : .markdown-body .octicon { display: inline-block; fill: curr ...
- 云原生爱好者周刊:利用 DNS 计算圆周率
开源项目推荐 dns.toys dns.toys 是一个比较有创意的 DNS 服务器,它利用 DNS 协议提供了很多非常有趣的功能和服务.例如查询时间.天气.圆周率.单位换算等等. Submarine ...
- 狂神说-Docker基础-学习笔记-05 Docker镜像原理
狂神说-Docker基础-学习笔记-05 Docker镜像原理 视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?p=19 镜像是什么 镜像是一种轻量级 ...
- WPF学习-布局
1. Grid布局 ,(Table 布局) 两行两列布局, Border 0 行 0 列默认开始 <Window x:Class="WpfApp.MainWindow" ...
- C++泛型一:模板
数据类型给程序设计带来的困扰及解决方案 int maxt(int, int); double maxt(double, double); 若有一种占位符T,能够代替类型,便可以简化代码的冗余编写 T ...
- NOIP2024模拟11:忠于自我
NOIP2024模拟11:忠于自我 T1 一句话题意:有若干个容量为 \(L\) 的包,从左往右装物品,当前包还能装则装,否则必须重开一个包装进去,对于\(\forall i \in [1,n]\), ...
- Java net.sf.jxls 生成模板 并导出excel
如果是 maven项目需要引入下面这个就可以 <dependency> <groupId>net.sf.jxls</groupId> <artifactId& ...