p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; min-height: 16.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #822d0f }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #c81b13 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3c828b }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000 }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #c42275 }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #6122ae }
p.p9 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa }
p.p10 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81 }
p.p11 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #539aa4 }
p.p12 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #294c50 }
span.s1 { }
span.s2 { font: 14.0px "PingFang SC" }
span.s3 { color: #0435ff }
span.s4 { color: #822d0f }
span.s5 { color: #c42275 }
span.s6 { color: #000000 }
span.s7 { color: #6122ae }
span.s8 { color: #703daa }
span.s9 { color: #3e1e81 }
span.s10 { color: #294c50 }
span.s11 { color: #539aa4 }
span.s12 { color: #78492a }

//

//  KCLWaveView.m

//  ButtonAnimation

//

//  Created by kcl on 2017/5/4.

//  Copyright © 2017年 KCL. All rights reserved.

//

#define BackGroundColor [UIColor colorWithRed:96/255.0f green:159/255.0f blue:150/255.0f alpha:1]

#define WaveColor1 [UIColor colorWithRed:136/255.0f green:199/255.0f blue:190/255.0f alpha:1]

#define WaveColor2 [UIColor colorWithRed:28/255.0 green:203/255.0 blue:174/255.0 alpha:1]

#import "KCLWaveView.h"

@interface KCLWaveView()

{

CAShapeLayer *_waveLayer1;

CAShapeLayer *_waveLayer2;

CADisplayLink *_disPlayLink;

CGFloat _waveAmplitude;

CGFloat _wavePalstance;

CGFloat _waveX;

CGFloat _waveY;

CGFloat _waveMoveSpeed;

}

//@property (nonatomic,strong)

@end

@implementation KCLWaveView

- (instancetype)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

[self setUI];

[self buildData];

}

return self;

}

- (void)setUI{

_waveLayer1 = [CAShapeLayer layer];

_waveLayer1.fillColor = WaveColor1.CGColor;

_waveLayer1.strokeColor = WaveColor1.CGColor;

[self.layer addSublayer:_waveLayer1];

_waveLayer2 = [CAShapeLayer layer];

_waveLayer2.fillColor = WaveColor2.CGColor;

_waveLayer2.strokeColor = WaveColor2.CGColor;

[self.layer addSublayer:_waveLayer2];

self.layer.cornerRadius = self.bounds.size.width/2.0f;

self.layer.masksToBounds = YES;

self.backgroundColor = BackGroundColor;

}

- (void)buildData{

_waveAmplitude = 10;

_wavePalstance = M_PI/self.bounds.size.width;

_waveX = 0;

_waveY = 0;

_waveMoveSpeed = _wavePalstance *2;

_disPlayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(upDataWave:)];

[_disPlayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];

}

- (void)upDataWave:(CADisplayLink *)link{

_waveX += _waveMoveSpeed;

[self updataWaveY];

[self updataWave1];

[self updataWave2];

}

- (void)updataWaveY{

CGFloat targetY = self.bounds.size.height - 0.3 * self.bounds.size.height;

if (_waveY < targetY) {

_waveY += 2;

}

if (_waveY > targetY ) {

_waveY -= 2;

}

}

- (void)updataWave1{

CGFloat waterWaveWidth = self.bounds.size.width;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, nil,0, _waveY);

CGFloat y = _waveY;

for (float x = 0.0f; x<= waterWaveWidth; x++) {

y = _waveAmplitude *cos(_wavePalstance*x +_waveX)+_waveY;

CGPathAddLineToPoint(path, nil, x, y);

}

CGPathAddLineToPoint(path, nil, waterWaveWidth, self.bounds.size.height);

CGPathAddLineToPoint(path, nil, 0, self.bounds.size.height);

CGPathCloseSubpath(path);

_waveLayer1.path = path;

CGPathRelease(path);

}

- (void)updataWave2{

CGFloat waterWaveWidth = self.bounds.size.width;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, nil,0, _waveY);

CGFloat y = _waveY;

for (float x = 0.0f; x<= waterWaveWidth; x++) {

y = _waveAmplitude *sin(_wavePalstance*x +_waveX)+_waveY;

CGPathAddLineToPoint(path, nil, x, y);

}

CGPathAddLineToPoint(path, nil, waterWaveWidth, self.bounds.size.height);

CGPathAddLineToPoint(path, nil, 0, self.bounds.size.height);

CGPathCloseSubpath(path);

_waveLayer2.path = path;

CGPathRelease(path);

}

- (void)dealloc{

[self stop];

if (_waveLayer1) {

[_waveLayer1 removeFromSuperlayer];

_waveLayer1 = nil;

}

if (_waveLayer2) {

[_waveLayer2 removeFromSuperlayer];

_waveLayer2 = nil;

}

}

- (void)stop{

if (_disPlayLink) {

[_disPlayLink invalidate];

_disPlayLink = nil;

}

}

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect {

// Drawing code

}

*/

@end

CAShapeLayer+CADisplayLink 波浪动画的更多相关文章

  1. iOS CAShapeLayer、CADisplayLink 实现波浪动画效果

    iOS CAShapeLayer.CADisplayLink 实现波浪动画效果 效果图 代码已上传 GitHub:https://github.com/Silence-GitHub/CoreAnima ...

  2. Android 自定义波浪动画 --"让进度浪起来~"

    原文链接:http://www.jianshu.com/p/0e25a10cb9f5 一款效果不错的动画,实现也挺简单的,推荐阅读学习~ -- 由 傻小孩b 分享 waveview <Andro ...

  3. CAShapeLayer的path动画

    CAShapeLayer的path动画 效果 源码 https://github.com/YouXianMing/Animations // // CAShapeLayerPathController ...

  4. SVG波浪动画

    今天来试试用svg+css3制作波浪动画 下图是我制作出的效果 还不错吧 在制作波浪前,首先我们要画波浪啊,至于画波浪,如果你想直接通过计算贝塞尔曲线绘制出波浪... 好吧,那我也不拦着你 我就直接用 ...

  5. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码

    iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实现与TableViewCell的常用样式介绍 实现阴影圆角并存,渐变色背景 ...

  6. CADisplayLink+弹簧动画实现果冻效果

    项目中在Tabbar中间的按钮要从底部弹出视图并有果冻效果,在CocoaChina中找了一篇博客用 UIBezierPath 实现果冻效果,github,自己就按着上面的demo修改了一下( 之前也是 ...

  7. iOS | CAShapeLayer转场动画

    什么也不说了,作为一名乐于分享技术的小开发,直接先上个样式最为直观贴切,有需要的朋友可以直接拿过去用. 需要demo请点击这里 :github 在这个demo中,核心为选用画布CAShapeLayer ...

  8. android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码

    Android精选源码 一款采用MVP架构的仿完整漫画APP源码 Android适配刘海屏幕 基于Xmpp协议的即时通讯社交软件(客户端+服务端) Android小黄车(ofo)app主页菜单效果 一 ...

  9. css 实现水波纹,波浪动画效果

    <div class="wave"> 水波纹效果 <div class="wave1"></div> <div cla ...

随机推荐

  1. App对接支付宝移动支付功能

    前段时间看了下app对接支付宝移动支付的功能,并自己总结了下支付宝移动支付的实现流程 一.申请流程          前提是已有现成的应用. 1.  申请地址            https://b ...

  2. angularjs fileUpload

    文件上传一直是我不熟悉的地方,<a href='https://github.com/nervgh/angular-file-upload/wiki/Module-API'>官网解释的例子 ...

  3. Halloc内存分配器

    MAX_NSBS 8192:默认的最大superblocks数量 SB_SET_SZ(MAX_NSBS / WORD_SZ):superblock set的大小,每个set32个superblcoks ...

  4. Oracle数据块损坏的恢复实例

    测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test ...

  5. windows_keyboard shortcuts快捷键

    单独按Windows:显示或隐藏"开始"功能表 Windows+BREAK:显示"系统属性" 对话框 Windows+D:显示桌面 Windows+M:最小化所 ...

  6. 光环国际PRINCE2培训费是多少?

    光环国际学习PRINCE2新活动 第一重好礼:获得商务背包一个 第二重好礼:获得600元学习代金券一张 第三重好礼:获得高清流程图一张 活动时间:2017年3月20日-3月31日 PRINCE2 (P ...

  7. CF615D Multipliers [数学]

    tags:[计数原理][乘法逆元][归纳の思想]题解(复杂度:O(mlogm)):棘手之处:n的约数多到爆炸.因此我们不妨从因子的角度来分析问题.对n分解质因数得:n = p1^a1 * p2^a2 ...

  8. 老李分享:大数据测试中java和hadoop关系

    Hadoop的创始人是Doug Cutting, 同时也是著名的基于Java的检索引擎库Apache Lucene的创始人.Hadoop本来是用于著名的开源搜索引擎Apache Nutch,而Nutc ...

  9. donet体系结构

    一.C#与.NET的关系 1.粗略地説,.net是一种在Windows平台上的编程架构----一种API.2.C#编译器专门用于.net,这表示用C#编写的所有代码总是使用.NET Framework ...

  10. 一个只有99行代码的JS流程框架

    张镇圳,腾讯Web前端高级工程师,对内部系统前端建设有多年经验,喜欢钻研捣鼓各种前端组件和框架. 最近一直在想一个问题,如何能让js代码写起来更语义化和更具有可读性. 上周末的时候突发奇想,当代码在运 ...