iOS 干货--实现炫酷波浪效果

前言

最近产品提出一个新需求,要实现一个波浪动画效果。自己研究,简单实现了一下,如果大家有别的方法可以共享一下?,谢谢!

核心思想

主要还是要使用贝塞尔曲线来画出整个过程。要根据振幅、偏移、角速度

样例地址

WaveEffect

效果

在这里插入图片描述

核心代码

static double i = 0; 

 CGFloat A = 10.f;//A振幅 
 CGFloat k = 0;//y轴偏移 
 CGFloat ω = 0.03;//角速度ω变大,则波形在X轴上收缩(波形变紧密);角速度ω变小,则波形在X轴上延展(波形变稀疏)。不等于0 
 CGFloat φ = 0 + i;//初相,x=0时的相位;反映在坐标系上则为图像的左右移动。 

 //y=Asin(ωx+φ)+k  

 _path = [UIBezierPath bezierPath]; 
 _path2 = [UIBezierPath bezierPath];  

 [_path moveToPoint:CGPointZero]; 
 [_path2 moveToPoint:CGPointZero]; 
 for (int i = 0; i < 376; i ++) { 

  CGFloat x = i; 

  CGFloat y = A * sin(ω*x+φ)+k; 
  CGFloat y2 = A * cos(ω*x+φ)+k; 
  [_path addLineToPoint:CGPointMake(x, y)]; 
  [_path2 addLineToPoint:CGPointMake(x, y2)]; 

 } 
 [_path addLineToPoint:CGPointMake(375, -100)]; 
 [_path addLineToPoint:CGPointMake(0, -100)]; 
 _path.lineWidth = 1; 
 _shapeLayer.path = _path.CGPath;  

 [_path2 addLineToPoint:CGPointMake(375, -100)]; 
 [_path2 addLineToPoint:CGPointMake(0, -100)]; 
 _path2.lineWidth = 1; 

  _shapeLayer2.path = _path2.CGPath; 



 i += 0.1; 

 if (i > M_PI * 2) { 

  i = 0;//防止i越界 

 } 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、波纹动画主要依赖于CAShapeLayer的绘制,使用帧动画实现;需要使用多个CAShapeLayer通过y值变换组成(这里我只是用了2个CAShapeLayer)。 2、渐变色由CAGradientLayer完成。 ``` - (void)changeFirstWaveLayerPath { CGMutablePathRef path = CGPathCreateMutable(); CGFloat y = _wavePointY; CGPathMoveToPoint(path, nil, 0, y); for (float x = 0.0f; x <= _waveWidth; x ) { y = _waveAmplitude * 1.6 * sin((250 / _waveWidth) * (x * M_PI / 180) - _waveOffsetX * M_PI / 270) _wavePointY; CGPathAddLineToPoint(path, nil, x, y); } CGPathAddLineToPoint(path, nil, _waveWidth, 0); CGPathAddLineToPoint(path, nil, 0, 0); CGPathCloseSubpath(path); _shapeLayer1.path = path; CGPathRelease(path); } - (void)changeSecondWaveLayerPath { CGMutablePathRef path = CGPathCreateMutable(); CGFloat y = _wavePointY; CGPathMoveToPoint(path, nil, 0, y); for (float x = 0.0f; x <= _waveWidth; x ) { y = _waveAmplitude * 1.6 * sin((250 / _waveWidth) * (x * M_PI / 180) - _waveOffsetX * M_PI / 180) _wavePointY; CGPathAddLineToPoint(path, nil, x, y); } CGPathAddLineToPoint(path, nil, _waveWidth, 0); CGPathAddLineToPoint(path, nil, 0, 0); CGPathCloseSubpath(path); _shapeLayer2.path = path; CGPathRelease(path); } ``` 方法调用: ``` _waveOffsetX = _waveSpeed; [self changeFirstWaveLayerPath]; [self changeSecondWaveLayerPath]; [self.layer addSublayer:self.gradientLayer1]; self.gradientLayer1.mask = _shapeLayer1; [self.layer addSublayer:self.gradientLayer2]; self.gradientLayer2.mask = _shapeLayer2; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值