效果图

代码已上传 GitHub:htt0p s : / / g i t hu b . c o m/ S il e n ce - G i t H u b /C o r e A n im a t i o n D em o

可以自定义波浪高度、宽度、速度、方向、渐变速度、水的深度等参数。

实现原理

波浪的形状绘制在 CAShapeLayer 上。通过 CADisplayLink 与屏幕刷新频率同步,每次刷新都绘制新的波浪,并改变小船的位置和角度。另外,水和天空的颜色是渐变的,由 CAGradientLayer 实现,其中,显示水的 CAGradientLayer 需要有波浪形状的 CAShapeLayer 的遮罩(mask)。

CAShapeLayer

CAShapeLayer 的属性 path (CGPath)就是图层要显示的形状。把波浪的形状绘制出来,赋值给此属性即可。

CADisplayLink

创建 CADisplayLink,相应的 target 实现屏幕刷新时要调用的方法。把 CADisplayLink 加入 RunLoop 中。通过 isPaused 属性控制 CADisplayLink 是否暂停(target 是否调用方法)

private var waveLink: CADisplayLink?
waveLink = CADisplayLink(target: self, selector: #selector(waveLinkRefresh))
waveLink?.isPaused = truewaveLink?.add(to: .current, forMode: .defaultRunLoopMode)

绘制波浪

波浪的形状关键是正弦函数曲线

y = A * sin(x + B)

参数 A 决定了波浪的高度;参数 B 决定了波浪在 x 轴的位置。

用一个属性 currentPhase 表示参数 B

private var currentPhase: CGFloat = 0

每次屏幕刷新的时候用 currentPhase 绘制,然后更新此属性,加上一个固定的数。这样波浪就会朝左或右匀速移动。

为了使波浪高度逐渐变化,用一个属性表示参数 A,然后每次绘制后更新此属性,加上一个固定的数,直到波浪高度达到目标值。

小船的位置和旋转角度

已知小船 x 轴坐标,通过正弦函数可以直接计算出小船的 y 轴坐标。此外,小船需要随着波浪旋转,旋转至船底与波浪表面相切。这就要对正弦函数进行求导

y' = A * cos(x + B)

用以上式子计算出小船所在位置的 y',表示正弦函数在此处的切线斜率,几何意义是切线与 x 轴的夹角的正切值。反正切即可求出切线与 x 轴的夹角,也就是小船需要旋转的角度

angle = atan(y')

用以上旋转角度,改变小船视图(UIView)的 transform,调用 CGAffineTransform 的 rotated(by:) 方法,实现小船的旋转。

CAGradientLayer

CAGradientLayer 默认的颜色渐变方向是由上至下。给 colors 属性赋值一个包含 CGColor 的数组,则图层颜色由上至下,从数组第一个值经中间值渐变至最后一个值。

显示水的 CAGradientLayer 需要呈现波浪形状,需要 CAShapeLayer 的遮罩。把绘制好波浪形状的 CAShapeLayer 赋值给 CAGradientLayer 的 mask 属性即可。

以上是动画效果的实现原理,具体见 Git H u b: h t t ps : / / gi t h u b. c o m / S i l e nc e - G i tH u b / C or e A n im a t i o n De m o

转载请注明出处:ht tp :/ / w w w .c n b l og s .c o m /s i l en c e -c n b l og s /p / 6 97 9 4 1 8 .h t m l

本文转自xmgdc51CTO博客,原文链接: http://blog.51cto.com/12953214/1940544,如需转载请自行联系原作者

iOS CAShapeLayer、CADisplayLink 实现波浪动画效果相关推荐

  1. ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果

    ios开发oc高仿京东金融白条额度余额的   ios开发水波纹   ios开发水正弦曲线波纹 直接上代码,复制粘贴就可以 vc里的 WaterRippleView *topView = [[Water ...

  2. ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果...

    ios开发oc高仿京东金融白条额度余额的   ios开发水波纹   ios开发水正弦曲线波纹 直接上代码,复制粘贴就可以 vc里的 WaterRippleView *topView = [[Water ...

  3. css3 线条出现动画效果,CSS3实现的线条波浪动画效果

    HTML结构 该css3线条波浪动画效果的HTML结构如下: CSS样式 然后通过下面的CSS代码来制作线条波浪动画效果. @keyframes move_wave { 0% { transform: ...

  4. css3波浪纹路_css3线条波浪动画效果

    这是一款使用CSS3 animation动画和png图片制作的css3线条波浪动画效果.该特效中,使用了3张波浪线条的png图片,以及少量的CSS代码,制作出逼真的线条波浪动画效果. 使用方法 HTM ...

  5. CSS3实现的线条波浪动画效果

    阅读目录 阐述 HTML结构 CSS 样式 预览 阐述 这是一款使用CSS3 animation 动画和 png 图片制作的 css3 线条波浪动画效果. 该特效中,使用了 3 张波浪线条的 png ...

  6. SVG滤镜波浪动画效果

    今天给大家分享一个用SVG实现的滤镜波浪动画效果,效果如下: 以下是代码实现,欢迎大家复制粘贴和收藏. <!DOCTYPE html> <html lang="en&quo ...

  7. Canvas科幻网状波浪动画效果

    下载地址Canvas科幻网状波浪动画效果是一款正弦波弧度波浪动画,像素块波浪特效. dd:

  8. SVG网页波浪动画效果背景

    给大家分享一个SVG网页波浪动画效果背景 CSS部分 <style> .body { min-height: 100vh; display: -webkit-box; display: f ...

  9. 【Qt】实现波浪动画效果

    所谓的波浪动画效果,就是多个正弦波形组合的效果. 先看看效果: 既然要画正弦波形,那就得先来了解正弦波,要绘制正弦波,其函数必须要了解.下面重拾高中知识,再一次再进正弦函数 正弦函数的物理意义: y ...

最新文章

  1. 自动驾驶L3量产追梦:如何跨过车规级和低成本门槛?
  2. 干货 | 循环神经网络LSTM的数学过程
  3. 苹果服务器消息转发,iphone-与APNS服务器进行交互以将推送通知发...
  4. 在SQLServer中自动产生移动数据库的TSQL语句
  5. python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典
  6. C# 乐观锁、悲观锁、共享锁、排它锁、互斥锁
  7. Matlab查看数组大小的命令——size、length、numel和ndims
  8. java网络io_彻底搞懂Java的网络IO
  9. 套用这8种数据治理方法,解决90%的数据治理问题
  10. 一个关于文件中位运算的的处理函数。
  11. Java讲课笔记09:类与对象
  12. POJ 2590 Steps (ZOJ 1871)
  13. configure 查看默认安装路径
  14. android安全权限管理,Android 11 中的权限更新
  15. 通常环境光照度参照表
  16. 一次RAC主机资源使用异常导致的节点重启
  17. 2021年中国电解液行业现状及竞争格局分析,龙头天赐材料市占持续提升,行业格局稳定「图」
  18. 大话 Python:python 操作 excel 系列 -- 数据的提取与筛选
  19. C# DataGridView设置行高度自动调整,以及行单元格自动换行
  20. cad怎么画坐标系箭头_怎样用CAD画一个路标箭头?,来学习吧

热门文章

  1. 手把手教学——记录在Winxp虚拟机上安装Vxworks操作系统及其编译器Tornado的详细过程(1——WinXP操作系统)
  2. 跟着数百万人编程导师学C语言!
  3. 网购假货乱象的罪与罚
  4. ftp服务器是什么,ftp服务器一般分为两类
  5. oracle批量插入报错,MyBatis Oracle批量插入数据
  6. 主板检测卡(DEBUG卡错误代码表)
  7. Vue3 简介及入门实例
  8. QSortFilterProxyModel实现排序、过滤
  9. java连接sql server2008_java连接sql-server-2008的四种方法
  10. 浏览器请求状态码为空,谷歌net::ERR_INSECURE_RESPONSE, 火狐Network error安全性错误无法载入此资源 ,IE网络错误0x800c0019访问此资源的安全证书无效问题