由于项目需要一个环形渐变进度条显示课程,这方便网上的确有很多相关资料但是,都是比较零散的而且,大多数只是放一堆代码就算完了。这里我想详细写一篇我自己实现这个进度条的过程。

实现一个圆弧进度条主要分为三步

一、画圆弧这里用的贝赛尔曲线,就是这个东西:UIBezierPath

二、根据贝塞尔曲线路径画两个圆弧一个底色一个上面的填充色,用到的是这个类CAShapeLayer.h

三、画两个渐变色块,把上面的进度条路径映射到渐变色块上,渐变色块用的是这个东西CAGradientLayer.h

目标效果如图

AirPlay_Movie_2017-11-29_04-42-48.gif

第一步:

我们把图案分解开来,就是一个圆环上面叠加一个圆环,底色的圆环是灰色,而上面的圆环是自定义颜色的。

首先我们画一个圆环,其实就是一个粗的圆形,这里用UIBezierPath来画。

效果图片:

代码:

//贝塞尔曲线画圆弧

UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.width / 2, self.height / 2) radius:(self.width - 20)/2 startAngle:0 endAngle:2 * M_PI clockwise:YES];

//设置颜色

[[UIColor blackColor] set];

//线粗细

circlePath.lineWidth = 10;

//开始绘图

[circlePath stroke];

这里主要要注意这个方法:

+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;

五个参数分别为

center:圆心

radius:半径

startAngle:起始角度

endAngle:终止角度

clockwise:是否顺时针画图

主要难理解的是startAngle 和 endAngle

在OC的官方文档中这样规定:

官方文档画圆弧.jpg

所以我要画出目标圆弧就需要从 3π/4 开始到 1π/4结束

方法改为:

UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.width / 2, self.height / 2) radius:(self.width - 20)/2 startAngle:M_PI / 4 + M_PI / 2 endAngle:M_PI / 4 clockwise:YES];

效果图:

黑色圆弧路径.jpg

第二步:

根据第一步画好的路径通过CAShapeLayer 画到layer层上去

先画灰色一圈:

CAShapeLayer *bgLayer = [CAShapeLayer layer];

bgLayer.frame = self.bounds;

bgLayer.fillColor = [UIColor clearColor].CGColor;//填充色 - 透明

bgLayer.lineWidth = 20.f;

bgLayer.strokeColor = ZCCRGBColor(212, 212, 212, 1.0).CGColor;//线条颜色

bgLayer.strokeStart = 0;//起始点

bgLayer.strokeEnd = 1;//终点

bgLayer.lineCap = kCALineCapRound;//让线两端是圆滑的状态

bgLayer.path = circlePath.CGPath;//这里就是把背景的路径设为之前贝塞尔曲线的那个路径

[self.layer addSublayer:bgLayer];

效果图:

弧形进度条底色.jpg

画出进度条圆弧

_shapeLayer = [CAShapeLayer layer];

_shapeLayer.frame = self.bounds;

_shapeLayer.fillColor = [UIColor clearColor].CGColor;

_shapeLayer.lineWidth = 20.f;

_shapeLayer.lineCap = kCALineCapRound;

// _shapeLayer.strokeColor = color.CGColor;

_shapeLayer.strokeColor = [UIColor blueColor].CGColor;

_shapeLayer.strokeStart = 0;

_shapeLayer.strokeEnd = 0.8;

_shapeLayer.path = circlePath.CGPath;

[self.layer addSublayer:_shapeLayer];

代码和上面大致一样就是改一下颜色还有 strokenEnd属性 让进度不是全满的,效果图如下:

蓝色进度条.jpg

第三步:

以上完成了基础的两步。现在就是最麻烦的渐变色这一块了。首先熟悉下处理渐变色的那个layer类,CAGradientLayer这个也是layer的子类,我这直接那例子讲吧

//初始化一个渐变图层

CAGradientLayer *leftGradientLayer = [CAGradientLayer layer];

//设frame

leftGradientLayer.frame = CGRectMake(0, 0, self.width / 2, self.height);

//设渐变颜色

//ZCCRGBColor是我自定义的宏 #define ZCCRGBColor(a,b,c,al) [UIColor colorWithRed:a/255.0 green:b/255.0 blue:c/255.0 alpha:al]

[leftGradientLayer setColors:[NSArray arrayWithObjects:(id)ZCCRGBColor(255, 255, 0, 1).CGColor, (id)ZCCRGBColor(255, 0, 0, 1).CGColor, nil]];

//这里设置渐变色渐变范围 0到1就是整个leftGradientLayer上都在渐变

[leftGradientLayer setLocations:@[@0,@1]];

//下面这两个就是渐变色方向Y越大就是越下面 所以是从下到上从黄到红渐变

[leftGradientLayer setStartPoint:CGPointMake(0, 1)];

[leftGradientLayer setEndPoint:CGPointMake(0, 0)];

添加到父图层

[_gradientLayer addSublayer:leftGradientLayer];

看一下效果图

左边从下到上渐变图层.jpg

修改下这个方法

[leftGradientLayer setLocations:@[@0,@0.5]];

效果图:

只有一半是渐变的.jpg

只有一边渐变上半部分全红。

再修改下这个属性 主要控制渐变色方向

[leftGradientLayer setLocations:@[@0,@1]];

[leftGradientLayer setStartPoint:CGPointMake(0, 1)];

[leftGradientLayer setEndPoint:CGPointMake(1, 0)];

这样就是对角线的渐变 效果图如下:

对角线渐变.jpg

所以简单点就是这样做渐变色的环 先设置宽高和环一样如下图

渐变色整块.jpg

然后再加下面这条代码 就能把渐变色图层颜色映射到环的layer上面

[self.gradientLayer setMask:_shapeLayer];

效果图

对角线渐变色圆弧.jpg

但是这里其实有个问题,当圆弧进度满的时候就能看到如下图:

对角线渐变圆弧全.jpg

可以看到上面图片的右下角并没有那么红所以不是真正的渐变。那么到底如何做到真正的渐变圆环呢?

其实上面刚开始画渐变图层的时候我就埋了个伏笔。

而且煞费苦心的测试了渐变图层的那几个属性,其实就是为了如下的效果:

左右渐变图层.jpg

然后映射到圆弧上如下效果图:

左右渐变块映射的圆弧.jpg

到这里其实还有个问题就是顶部过度会有一个明显的断层

所以我们就要用到[leftGradientLayer setLocations:@[@0,@0.5]];这个属性了 设置渐变色范围。让顶部渐变色基本不动

左边的渐变色块:

[leftGradientLayer setLocations:@[@0,@0.9]];

右边的渐变色块:

[rightGradientLayer setLocations:@[@0.1, @1]];

再看看效果图

图片.png

好了 这就差不多完成一个渐变色圆弧了,如果强迫症的朋友其实可以弄四个渐变色块从 左下→左上→右上→右下 依次渐变再映射,那样就会更加完美。

终于写完了。。新手第一次写这样的教学文 有什么错误的地方还请多包涵指出,不懂得可以留言问我

最后,动画是怎么实现的呢??

是通过timer 设置_shapeLayer.strokeEnd这个 strokEnd属性实现的

以下是具体代码~

- (void)animateToProgress:(CGFloat)progress{

// NSLog(@"增加到progress%lf", progress);

if(_shapeLayer.strokeEnd != 0){

[self animateToZero];

}

__weak typeof(self)weakSelf = self;

NSLog(@"-----%lf",_shapeLayer.strokeEnd);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_shapeLayer.strokeEnd * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[weakSelf deleteTimer];

NSString *progressStr = [NSString stringWithFormat:@"%lf",progress];

NSDictionary *userInfo = @{@"progressStr":progressStr};

weakSelf.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:weakSelf selector:@selector(animate:) userInfo:userInfo repeats:YES];

});

}

- (void)animate:(NSTimer *)time{

CGFloat progress = [[time.userInfo objectForKey:@"progressStr"] floatValue];

if(_shapeLayer.strokeEnd <= progress)

{

_shapeLayer.strokeEnd += 0.01;

}else{

[self deleteTimer];

}

}

//回滚到0 先判断 timer 有没有存在 存在 就把timer 删除

- (void)animateToZero{

// NSLog(@"删除到0");

[self deleteTimer];

self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(animateReset) userInfo:nil repeats:YES];

}

- (void)animateReset{

if(_shapeLayer.strokeEnd > 0){

_shapeLayer.strokeEnd -= 0.01;

}else{

[self deleteTimer];

}

}

- (void)deleteTimer{

[self.timer invalidate];

self.timer = nil;

}

ios弧形进度条_iOS圆弧渐变进度条的实现相关推荐

  1. android 锥形进度条,canvas锥形渐变进度条

    从一个渐变圆角进度条浅出画一个圆 开始 这一切需要从一个(简单)的需求开始,在最开始对设计第一眼看到这张图的时候,感觉挺简单的嘛,直接用echarts饼图模拟出来一个就好了 echarts 然后上ec ...

  2. ios 圆形旋转菜单_iOS高级动画:圆形树展开收起动画

    转自:标哥的技术博客,作者:黄仪标(微博) 前段时间帮某某做了一个动画效果,今天分享给大家.关于动画的基础知识,这里不会细说,如果您还没有核心动画的基础知识,请先阅读相关文章,了解核心动画如何使用,然 ...

  3. ios弧形进度条_【iOS实现一个颜色渐变的弧形进度条】

    在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...

  4. android 圆形渐变背景,android实现圆形渐变进度条

    最近项目中使用到了渐变效果的圆形进度条,网上找了很多渐变效果不够圆滑,两个渐变颜色之间有明显的过渡,或者有些代码画出来的效果过渡不美观,于是自己参照写了一个,喜欢的朋友可以参考或者直接使用. 先上一张 ...

  5. echarts渐变进度条

    echarts渐变进度条 展示情况如下图 相关代码 var data = ['数据一','数据二',"数据三","数据四","数据五",&q ...

  6. 大屏可视化数据面板分格渐变进度条、数字翻牌器及其刷新动效实现

    数据可视化大屏是当前可视化领域的一项热门应用,通常可以分为信息展示类.数据分析类及监控预警类.这类应用的视觉设计通常效果炫酷,动效丰富,有时候一些页面布局和动画实现会对前端人员有一定的挑战性,在这里分 ...

  7. Android开发之绘制自定义进度条 | 渐变进度条 | 斜角进度条的方法

    老套路先上图 先看上面的斜角进度条的实现方法: package cn.yhsh.appwidget;import android.content.Context; import android.gra ...

  8. 在html中怎么用圆形渐变,css怎么实现圆形渐变进度条效果

    css怎么实现圆形渐变进度条效果 发布时间:2021-03-17 10:29:57 来源:亿速云 阅读:129 作者:小新 这篇文章给大家分享的是有关css怎么实现圆形渐变进度条效果的内容.小编觉得挺 ...

  9. css3做渐变进度条

    布局: <body><section class="container"><div class="loading-bar"> ...

  10. Android可触摸圆形进度条,Android 可滚动圆形进度条 滑块和进度在进度条上面跟着滚动...

    Android 可滚动圆形进度条 滑块和进度在进度条上面跟着滚动.package com.example.test; import android.content.Context; import an ...

最新文章

  1. “Matlab R2016a中运行‘mex -setup’,错误使用 mex 未找到支持的编译器或 SDK”的解决办法
  2. 编译linux内核步骤
  3. eclipse tomcat内存设置
  4. Springboot+Apollo
  5. 菜鸟涂鸦作品展_No.4
  6. PHP WEB程序设计信息表,PHP WEB程序设计
  7. java ssl证书_Java安全教程–创建SSL连接和证书的分步指南
  8. opencv 滤镜效果php,OpenCV实现马赛克和毛玻璃滤镜效果
  9. win10环境下VTK7.1的编译和Qt调用VTK的详细教程二(VS2013编译支持Qt的VTK库)
  10. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
  11. 安装Nginx到linux服务器(Ubuntu)详解
  12. Eclipse安装插件的“最好方法”:dropins文件夹的妙用
  13. 如何修改文件的编码格式
  14. PR2打印机参数设置
  15. Asp.Net Core报错System.Text.Json.JsonException: A possible object cycle was detected which is not supp
  16. Linux下只允许用户远程scp
  17. 网易云音乐关键字搜索并生成下载url
  18. 【PDN仿真笔记9-使用Sigrity PowerDC进行IR Drop仿真的方法】
  19. 欧莱雅的矿物质粉今天去买回来了
  20. hive表中的数据导出

热门文章

  1. VC6 Tips 002: WndTabs 插件
  2. Fiddler4抓包筛选条件方法
  3. 四川大学mac用户登陆锐捷校园网指南
  4. 【廖雪峰python教程学习】——(一)python基础
  5. 记录—java获取服务器的信息
  6. visio之图案填充
  7. MATLAB中使用IPOPT去解NLP问题的接口:AMPL 工具
  8. java怎么设置_java环境配置怎么设置?Java基础教程
  9. c语言求统计硬币正反次数,C语言猜测硬币正反面
  10. php 验证手机号码(海外手机号)