CAShapeLayer实现圆形进度条效果
一、CAShapeLayer简单介绍:
、CAShapeLayer继承至CALayer,能够使用CALayer的全部属性值
2、CAShapeLayer须要与贝塞尔曲线配合使用才有意义
3、使用CAShapeLayer与贝塞尔曲线能够实现不在view的drawRect方法中画出一些想要的图形
4、CAShapeLayer属于CoreAnimation框架,其动画渲染直接提交到手机的GPU其中,相较于view的drawRect方法使用CPU渲染而言,其效率极高,能大大优化内存使用情况
五角星动画
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong) NSTimer *timer;
@property (nonatomic,strong) CAShapeLayer *shapeLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//
创建shapeLayer
_shapeLayer = [CAShapeLayerlayer];
_shapeLayer.frame = (CGRect){CGPointMake(,), CGSizeMake(,)};
_shapeLayer.position =self.view.center;
_shapeLayer.path = [selfgetStar1BezierPath].CGPath;
_shapeLayer.fillColor = [UIColorclearColor].CGColor;
_shapeLayer.strokeColor = [UIColorredColor].CGColor;
_shapeLayer.lineWidth =2.f;
[self.view.layeraddSublayer:_shapeLayer];
//
创建定时器
_timer = [NSTimerscheduledTimerWithTimeInterval:1.f
target:self
selector:@selector(pathAnimation)
userInfo:nil
repeats:YES];
}
/**
* 运行path的动画
*/
- (void)pathAnimation {
;
==) {
CABasicAnimation *circleAnim = [CABasicAnimationanimationWithKeyPath:@"path"];
circleAnim.removedOnCompletion =NO;
circleAnim.;
circleAnim.fromValue = (__bridgeid)[self getStar1BezierPath].CGPath;
circleAnim.toValue = (__bridgeid)[self getStar2BezierPath].CGPath;
_shapeLayer.path = [selfgetStar2BezierPath].CGPath;
[_shapeLayeraddAnimation:circleAnim forKey:@"animateCirclePath"];
}else {
CABasicAnimation *circleAnim = [CABasicAnimationanimationWithKeyPath:@"path"];
circleAnim.removedOnCompletion =NO;
circleAnim.;
circleAnim.fromValue = (__bridgeid)[self getStar2BezierPath].CGPath;
circleAnim.toValue = (__bridgeid)[self getStar1BezierPath].CGPath;
_shapeLayer.path = [selfgetStar1BezierPath].CGPath;
[_shapeLayeraddAnimation:circleAnim forKey:@"animateCirclePath"];
}
}
/**
* 贝塞尔曲线1
*
* @return 贝塞尔曲线
*/
-(UIBezierPath *)getStar1BezierPath {
//// Star Drawing
UIBezierPath* starPath = [UIBezierPathbezierPath];
[starPathmoveToPoint: CGPointMake(22.5,2.5)];
[starPath addLineToPoint:CGPointMake(28.32,14.49)];
[starPath addLineToPoint:CGPointMake(41.52,16.32)];
[starPath addLineToPoint:CGPointMake(31.92,25.56)];
[starPath addLineToPoint:CGPointMake(34.26,38.68)];
[starPath addLineToPoint:CGPointMake(22.5,32.4)];
[starPath addLineToPoint:CGPointMake(10.74,38.68)];
[starPath addLineToPoint:CGPointMake(13.08,25.56)];
[starPath addLineToPoint:CGPointMake(3.48,16.32)];
[starPath addLineToPoint:CGPointMake(16.68,14.49)];
[starPathclosePath];
return starPath;
}
/**
* 贝塞尔曲线2
*
* @return 贝塞尔曲线
*/
-(UIBezierPath *)getStar2BezierPath {
//// Star Drawing
UIBezierPath* starPath = [UIBezierPathbezierPath];
[starPathmoveToPoint: CGPointMake(22.5,2.5)];
[starPath addLineToPoint:CGPointMake(32.15,9.21)];
[starPath addLineToPoint:CGPointMake(41.52,16.32)];
[starPath addLineToPoint:CGPointMake(38.12,27.57)];
[starPath addLineToPoint:CGPointMake(34.26,38.68)];
[starPath addLineToPoint:CGPointMake(22.5,38.92)];
[starPath addLineToPoint:CGPointMake(10.74,38.68)];
[starPath addLineToPoint:CGPointMake(6.88,27.57)];
[starPath addLineToPoint:CGPointMake(3.48,16.32)];
[starPath addLineToPoint:CGPointMake(12.85,9.21)];
[starPathclosePath];
return starPath;
}
@end
二、贝塞尔曲线与CAShapeLayer的关系
1、CAShapeLayer中有Shape这个单词。顾名思义,它须要一个形状才干生效
2、贝塞尔曲线能够创建基于矢量的路径
3、贝塞尔曲线给CAShapeLayer提供路径。CAShapeLayer在提供的路径中进行渲染。路径会闭环,所以路径绘制出了Shape
4、用于CAShapeLayer的贝塞尔曲线作为path,其path是一个首尾相接的闭环的曲线,即使该贝塞尔曲线不是一个闭环的曲线
注意:shape的frame
要大于BezierPath的frame.BezierPath不会由于share的frame而拉升。否则BezierPath截断
- (void)viewDidLoad {
[superviewDidLoad];
//创建椭圆形贝塞尔曲线
UIBezierPath *oval = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(,,
,)];
//创建矩形贝塞尔曲线
UIBezierPath *rect = [UIBezierPathbezierPathWithRect:CGRectMake(,,
,)];
//创建圆形贝塞尔曲线
UIBezierPath *circle = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(,,
,)];
//
创建CAShapeLayer
CAShapeLayer *shape = [CAShapeLayerlayer];
shape.frame =CGRectMake(,,
, );
shape.position =self.view.center;
//
显示CAShapeLayer的边界
shape.borderWidth =1.f;
//
禁止内容显示超出CAShapeLayer的frame值
shape.masksToBounds =YES;
//改动贝塞尔曲线的填充颜色
shape.fillColor = [UIColorredColor].CGColor;
//
建立贝塞尔曲线与CAShapeLayer之间的关联
shape.path = circle.CGPath;
//
加入并显示
[self.view.layeraddSublayer:shape];
}
三、StrokeStart与StrokeEnd动画
、将ShapeLayer的fillColor设置成透明背景
2、设置线条的宽度(lineWidth)的值
3、设置线条的颜色
、将strokeStart值设定成,然后让strokeEnd的值变化触发隐式动画
@interface ViewController ()
@property (nonatomic,strong) NSTimer *timer;
// 定时器
@property (nonatomic,strong) CAShapeLayer *shapeLayer;//
形状layer
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//
设置背景色
];
//创建椭圆形贝塞尔曲线
UIBezierPath *oval = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(,,
,)];
//
创建CAShapeLayer
_shapeLayer = [CAShapeLayerlayer];
_shapeLayer.frame =CGRectMake(,,
, );
_shapeLayer.position =self.view.center;
//
改动CAShapeLayer的线条相关值
_shapeLayer.fillColor = [UIColorclearColor].CGColor;
_shapeLayer.strokeColor = [UIColorredColor].CGColor;
_shapeLayer.lineWidth =2.f;
_shapeLayer.strokeStart =0.f;
_shapeLayer.strokeEnd =0.f;
//
建立贝塞尔曲线与CAShapeLayer之间的关联
_shapeLayer.path = oval.CGPath;
//
加入并显示
[self.view.layeraddSublayer:_shapeLayer];
//
创建定时器
_timer = [NSTimerscheduledTimerWithTimeInterval:1.f
target:self
selector:@selector(animationEventTypeTwo)
userInfo:nil
repeats:YES];
}
/**
* 动画效果1
*/
- (void)animationEventTypeOne {
//
运行隐式动画
_shapeLayer.strokeEnd =arc4random() % /100.f;
}
/**
* 动画效果2
*/
- (void)animationEventTypeTwo {
CGFloat valueOne = arc4random() % /
100.f;
CGFloat valueTwo = arc4random() % /
100.f;
// storkeStar
与storkeEnd同一时候赋值。strokeStart要小于strokeEnd的值
//
运行隐式动画
_shapeLayer.strokeStart = valueOne < valueTwo ?
valueOne : valueTwo;
_shapeLayer.strokeEnd = valueOne > valueTwo ?
valueOne : valueTwo;
}
@end
四、用CAShapeLayer实现圆形进度条效果
1、确定须要设定的參数
2、实现细节
3、进行測试
@interface CircleView :UIView
@property (nonatomic,assign) CGFloat startValue;//
起始值(0~1)
@property (nonatomic,assign) CGFloat lineWidth;
// 线宽(>0)
@property (nonatomic,strong) UIColor *lineColor;
// 线条颜色
@property (nonatomic,assign) CGFloat value;
// 变化的值
@end
#import "CircleView.h"
@interface CircleView ()
@property (nonatomic,strong)
CAShapeLayer *shapeLayer;
@end
@implementation CircleView
- (instancetype)initWithFrame:(CGRect)frame {
self = [superinitWithFrame:frame];
if (self) {
//
创建出CAShapeLayer
_shapeLayer = [CAShapeLayerlayer];
_shapeLayer.frame =self.bounds;
//
创建出贝塞尔曲线
UIBezierPath *path = [UIBezierPathbezierPathWithOvalInRect:self.bounds];
//
贝塞尔曲线与CAShapeLayer产生关联
_shapeLayer.path = path.CGPath;
// 基本配置
_shapeLayer.fillColor = [UIColorclearColor].CGColor;
_shapeLayer.lineWidth =1.f;
_shapeLayer.strokeColor = [UIColorredColor].CGColor;
_shapeLayer.strokeEnd =0.f;
//
加入到当前view
[self.layeraddSublayer:_shapeLayer];
}
return
self;
}
@synthesize startValue =_startValue;
- (void)setStartValue:(CGFloat)startValue {
_startValue = startValue;
_shapeLayer.strokeEnd = startValue;
}
- (CGFloat)startValue {
return_startValue;
}
@synthesize lineWidth =_lineWidth;
- (void)setLineWidth:(CGFloat)lineWidth {
_lineWidth = lineWidth;
_shapeLayer.lineWidth = lineWidth;
}
- (CGFloat)lineWidth {
return_lineWidth;
}
@synthesize lineColor =_lineColor;
- (void)setLineColor:(UIColor *)lineColor {
_lineColor = lineColor;
_shapeLayer.strokeColor = lineColor.CGColor;
}
- (UIColor *)lineColor {
return_lineColor;
}
@synthesize value = _value;
- (void)setValue:(CGFloat)value {
_value = value;
_shapeLayer.strokeEnd = value;
}
- (CGFloat)value {
return _value;
}
@end
#import "CircleView.h"
@interface
ViewController ()
{
CircleView *circle;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
circle = [[CircleViewalloc] initWithFrame:CGRectMake(,,
, )];
circle.center =self.view.center;
circle.startValue =0.5;
circle.lineWidth =3.f;
circle.lineColor = [UIColorgrayColor];
[self.viewaddSubview:circle];
[selfperformSelector:@selector(delayAnimation)
withObject:nil
afterDelay:3.f];
}
- (void)delayAnimation {
circle.value =1.f;
}
@end
CAShapeLayer实现圆形进度条效果的更多相关文章
- html5 svg 圆形进度条
html5 svg 圆形进度条 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- Android 自定义 View 圆形进度条总结
Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...
- canvas 绘制圆形进度条
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画
通过CAShapeLayer和贝塞尔曲线搭配的方法,创建的简单的圆形进度条的教程先简单的介绍下CAShapeLayer1,CAShapeLayer继承自CALayer,可使用CALayer的所有属性2 ...
- 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画【装载】
初次接触CAShapeLayer和贝塞尔曲线,看了下极客学院的视频.对初学者来说感觉还不错.今天来说一个通过CAShapeLayer和贝塞尔曲线搭配的方法,创建的简单的圆形进度条的教程先简单的介绍下C ...
- HTML5效果:Canvas 实现圆形进度条并显示数字百分比
实现效果 1.首先创建html代码 <canvas id="canvas" width="500" height="500" styl ...
- 用HTML、CSS、JS制作圆形进度条(无动画效果)
逻辑 1.首先有一个圆:蓝色的纯净的圆,效果: 2.再来两个半圆,左边一个,右边一个将此蓝色的圆盖住,效果: 此时将右半圆旋转60°,就会漏出底圆,效果: 然后我们再用一个比底圆小的圆去覆盖这个大 ...
- WPF 实现圆形进度条
项目中用到圆形进度条,首先就想到使用 ProgressBar 扩展一个,在园子里找到迷途的小榔头给出的思路和部分代码,自己加以实现. 进度小于60显示红色,大于60则显示绿色.效果如下: 基本思路: ...
- iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- 咏南3层数据集控件--TYNDataSet
咏南3层数据集控件--TYNDataSet 和2层CS数据集的语法非常近似.有了这个控件,学习掌握3层开发变得如此地简单. 新增数据: procedure Tfunit.btnappendClick( ...
- NoHttp详解之NoHttp最基本使用(无封装)
NoHttp详细使用文档,请点我移步! 这里是一个最基本的使用,在项目中也可以直接这样使用,如果想学习更多请移步NoHttp主页: https://github.com/yanzhenjie/NoHt ...
- Incorrect key file for table '/tmp/#sql_46fd_0.MYI'; try to repair it
当查询数量很大时,(我的数据库70万数据),会导致这个错误,这是MYSQL中的一个bug. 解决方法 : 1. 修复表 check table tablename. 查看表的状态.如果有错误,则需 ...
- Hash history cannot PUSH the same path; a new entry will not be added to the history stack
这个是reactr-router的一个提示,当前路由下的history不能push相同的路径.只有开发环境存在,生产环境不存在,目前还没看到官方有去掉的意思.看不惯的话可以采取一些方法关掉这个提示.具 ...
- ylbtech_dbs_article_五大主流数据库模型
ylbtech_dbs_article 摘要:什么是数据模型? 访问数据库中的数据取决于数据库实现的数据模型.数据模型会影响客户端通过API对数据的操作.不同的数据模型可能会提供或多或少的功能.一般而 ...
- AFN检測网络情况
问: I'm a bit lost on AFNetorking's Reachability and haven't found a lot of good information out ther ...
- windows pip源
首先在window的文件夹窗口输入 : %APPDATA% 然后在底下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini,然后再里面输入内容 [global] timeout = 6000 ...
- Java除法结果带小数、进一法的实现 Java问题通用解决代码
http://blog.csdn.net/windone0109/article/details/5355379进一法: 即省略的位上只要大于零都要进一位 : 四舍五入法: 即省略的位上小于五都要舍 ...
- linux系统下使用apt-get install 方法安装lamp环境
1.更新源,获得最近的软件包的列表,列表中包含一些包的信息,比如这个包是否更新过. sudo apt-get update 2.更新系统中已安装的软件包 sudo apt-get upgrade 3. ...
- Android 应用程序分析
从这点上看,android应用程序实际上是由多个Activity按照一定的次序拼装起来的, 只不过拼装的过程中,后台传递了一些数据,使得各个Activity之间能比较好的衔接起来. 在 and ...