水波动效

应用:一般用于图片装饰,增加层次感。

附上动效图:

实现其实不难,使用遮罩绘制路径即可,这里路径是高中时学过的正弦函数

 y = Asin(wx+b)+c

 - A是指曲线的振幅

 - w好像是相位,决定曲线的周期  2pi/w

 - b,可看做是w(x+b/w),是x的横线偏移量

 - c是y的纵向偏移量

这里附上一张正弦曲线图,搞不懂的同学可以仔细对着图思考一下及各参数的含义

再给大家捋捋

  1.自定义子视图

  2.自定义CAShapeLayer,绘制正弦曲线,赋值为子视图的mask,实现正弦曲线的裁剪效果

  3.绘制多条曲线,相互叠加,实现预期效果

 

会指曲线的代码如下

- (UIBezierPath *)createSinglePath:(CGFloat)offsetx scale:(int)factor {
    // y = Asin(w(x+b))+c
    /// 振幅A取视图高度 视图宽度刚好为一个周期    横向偏移外部传入,纵向偏移为0
    CGFloat width = CGRectGetWidth(self.frame);
    CGFloat height = CGRectGetHeight(self.frame);
    CGFloat A = height/4;
    CGFloat W = M_PI*2/width;
    CGFloat offy = A*factor;
    
    UIBezierPath *path = [UIBezierPath new];
    // 路径默认剪切i下半部分
    [path moveToPoint:CGPointMake(width, 0)];
    [path addLineToPoint:CGPointMake(0, 0)];
    for (int i = 0; i <= width; i++) {
        CGFloat y = A * sinf(W*(i+offsetx))+offy;
        [path addLineToPoint:CGPointMake(i, y)];
    }
    [path closePath];
    return path;
}

通常是将一个屏幕宽设置为一个周期长,振幅A不要太大,不然不好看,结合CADisplayLink不断偏移x,实现y值上下偏移,空间上给读者一种向左流动的错觉。

{
  CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(refreshWaterWave)];
  link.perferredFramePerSeconds = 30;  // 1秒多少帧,苹果默认是1秒60帧,这里设置为30,意味着1秒刷新2次
  [link addToRunloop:NSRunloop.mainRunloop forMode:NSRunloopCommonModes];
}

- (void)refreshWaterWave {

   static CGFloat offsetX = 0;

   maskLayer.path = [self createSinglePath:offsetX scale:1];

   offsetX += 1;

 }

 

谈下需要注意的几个细节

1.路径叠加的顺序应该是由上到下,并且底下的波纹应当包含上面的波纹

2.多条波纹之间的偏移速度应当相近,最好能周期性变化,这样使得水波好看

 

github传送门

 

转载于:https://www.cnblogs.com/xiaoerheiwatu/p/9966429.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值