CAShapeLayer+CADisplayLink 波浪动画
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 波浪动画的更多相关文章
- iOS CAShapeLayer、CADisplayLink 实现波浪动画效果
iOS CAShapeLayer.CADisplayLink 实现波浪动画效果 效果图 代码已上传 GitHub:https://github.com/Silence-GitHub/CoreAnima ...
- Android 自定义波浪动画 --"让进度浪起来~"
原文链接:http://www.jianshu.com/p/0e25a10cb9f5 一款效果不错的动画,实现也挺简单的,推荐阅读学习~ -- 由 傻小孩b 分享 waveview <Andro ...
- CAShapeLayer的path动画
CAShapeLayer的path动画 效果 源码 https://github.com/YouXianMing/Animations // // CAShapeLayerPathController ...
- SVG波浪动画
今天来试试用svg+css3制作波浪动画 下图是我制作出的效果 还不错吧 在制作波浪前,首先我们要画波浪啊,至于画波浪,如果你想直接通过计算贝塞尔曲线绘制出波浪... 好吧,那我也不拦着你 我就直接用 ...
- iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码
iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实现与TableViewCell的常用样式介绍 实现阴影圆角并存,渐变色背景 ...
- CADisplayLink+弹簧动画实现果冻效果
项目中在Tabbar中间的按钮要从底部弹出视图并有果冻效果,在CocoaChina中找了一篇博客用 UIBezierPath 实现果冻效果,github,自己就按着上面的demo修改了一下( 之前也是 ...
- iOS | CAShapeLayer转场动画
什么也不说了,作为一名乐于分享技术的小开发,直接先上个样式最为直观贴切,有需要的朋友可以直接拿过去用. 需要demo请点击这里 :github 在这个demo中,核心为选用画布CAShapeLayer ...
- android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码
Android精选源码 一款采用MVP架构的仿完整漫画APP源码 Android适配刘海屏幕 基于Xmpp协议的即时通讯社交软件(客户端+服务端) Android小黄车(ofo)app主页菜单效果 一 ...
- css 实现水波纹,波浪动画效果
<div class="wave"> 水波纹效果 <div class="wave1"></div> <div cla ...
随机推荐
- HashSet和TreeSet 的区别与分析
Set是java中一个不包含重复元素的collection.更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素.正如其名称所暗示的, ...
- 第一次"正经面试"之发现自己的缺陷和不足
1:初试之校园招聘~~~ 如果你细心,可能发现了"正经面试"加了双引号,说起这次面试(昨天面的技术试),要从上礼拜六,距今已经一礼拜了吧.现在这个时候校园招聘已经蠢蠢欲动了吧,(说 ...
- Tomcat+Eclipse乱码问题解决方法
概述 乱码问题是大家在日常开发过程中经常会遇到的问题,由于各自环境的不同,解决起来也费时费力,本文主要介绍一般性乱码问题的解决方法与步骤,开发工具采用Eclipse+Tomcat,统一设置项目编码UT ...
- 2017年3月23日 坚果性能测试Loadrunner 免费公开课
2017-03-23 坚果性能测试1群 607937164 我昨天看了一下飞扬老师的讲义PPT,真的很棒,BAT的专业性能老师果然是有好几把刷子,十分受教,相信周四的公开课一定会让大家收益颇丰的. ...
- iOS开发之UIDevice通知
UIDevice类提供了一个单例对象,它代表着设备,通过它可以获得一些设备相关的信息,比如电池电量值(batteryLevel).电池状态(batteryState).设备的类型(model,比如iP ...
- linux之date命令详解
date命令的用处 1.用于显示特殊的时间格式,可以用于对日志文件的命名 2.用于设置时间 ,不过这方面用的比较少,因为一般的服务器都设置的有自动同步网络时间 用法: date [OPTION]... ...
- Pycharm集成PyQt4并使用
- SUSE linux 使用LVM安装系统和管理
引出 在我们安装好linux系统后会发现在需要修改磁盘分区的时候会比较困难,系统安装的/目录的文件系统要更改基本不太可能,其他目录如/home目录也比较困难.但是系统安装时要是采用的LVM管理的方式安 ...
- IOS开发创建开发证书及发布App应用(九)——等待审核(审核几种状态)
以下是App应用的几种状态,如果看不到英文,建议复制到网站翻译一下就行,意思差不多能明白的 以上整套流程是在2013年写的,可能有些地方已经不太一样了,只是给大家做一下参考,毕竟再怎么改大概流程还是差 ...
- es 6点滴记录
关于babel和webpack的使用: Babel 所做的只是帮你把'ES6 模块化语法'转化为'CommonJS 模块化语法',其中的require exports 等是 CommonJS 在具体实 ...