画个Shape留意到的东西
这几个知识点
在 CoreGraphics 框架中有这样一个方法:
public func addArc(center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool)
这个方法是用来画圆的,这个方法就引出第一个知识点 startAngle 和 endAngle ,按照通俗的方法就是画的圆的起点的角度和结束点的角度。也就是我们的 0 - 2π ,最后一个参数是 是否顺时针。
按照我们学习到的知识,这圆周上任何一个圆角度 + 2π和原本的圆角度的值是一样的,比如下面的0和2π都是一个角度值的。这点东西在下面我们画进度的时候会用到的。

/* Set the line cap in the current graphics state to `cap'. */
@available(iOS 2.0, *)
public func setLineCap(_ cap: CGLineCap)
这个CGLineCap 我们在下面也有使用到,都已同样的含义,只是定义稍微有点不同,针对这个点 在这篇文章中有说清楚的
还有一点需要我们留意的,就是抗锯齿的效果,具体的这篇文章留意
CALayer 都加应该都知道,我们用到的是它的子类 CAShapeLayer,还有一个 CADisplayLink ,关于 CADisplayLink 和NSTime的比较我以前有说过,这里就不再重复写了,有兴趣的可以翻一下以前的文章,或者搜一下他们两者之间的区别。
最后我们就需要 UIBezierPath 帮我们指定一下画圆的路径。
效果是这样的

看看代码
第一步:画这个进度的底色圆
func drawBaseProcess () -> Void {
let path:UIBezierPath = UIBezierPath(arcCenter: CGPoint(x: kScreenWidth/2, y: 200), radius: 100, startAngle: 0, endAngle: CGFloat(2 * Double.pi), clockwise: true)
let shadowLayer = CAShapeLayer()
shadowLayer.fillColor = UIColor.clear.cgColor
shadowLayer.strokeColor = UIColor.green.cgColor
shadowLayer.frame = self.bounds;
// 边框的宽度
shadowLayer.lineWidth = backgroundLineWidth
shadowLayer.path = path.cgPath
self.layer.addSublayer(shadowLayer)
}
第二步:绘制这个显示进度的圆
func drawProcessing() -> Void {
circleLayer = CAShapeLayer()
circleLayer.fillColor = UIColor.clear.cgColor
circleLayer.strokeColor = UIColor(red: 64/255.0, green: 10/255.0, blue: 107/255.0, alpha: 1.0).cgColor
/// 这个是设置线的头部是圆角
circleLayer.lineCap = CAShapeLayerLineCap.round
circleLayer.frame = self.bounds
circleLayer.lineWidth = progressLineWidth
self.layer.addSublayer(circleLayer);
/// lineBreakMode属性介绍 https://www.jianshu.com/p/9dfc06b4bed9
progressLabel.lineBreakMode = NSLineBreakMode.byTruncatingTail
/// 进度记录
self.progressLabel.text = String(format: "%.2f", self.progress);
///
let endangle:CGFloat = CGFloat(1.5 * Double.pi) + self.progress * pi2
/// 计时器停止
if self.progress >= 1 {
displayLink?.invalidate()
}
///
let bezierPath = UIBezierPath(arcCenter: CGPoint(x: kScreenWidth/2, y: 200), radius: 100, startAngle: CGFloat(1.5 * Double.pi), endAngle: endangle, clockwise: true)
self.circleLayer.path = bezierPath.cgPath;
}
第三步:我们需要一个计时器帮助我们实现这个进度(当然在实际的项目中有你自己的控制需求)
override init(frame: CGRect) {
super.init(frame: frame)
///self.backgroundColor = UIColor.init(red: 0, green: 0, blue: 0, alpha: 0.6)
self.backgroundColor = .white
///
self.addSubview(progressLabel)
/// 画进度条的底圈
drawBaseProcess()
/// 定时器
displayLink = CADisplayLink.init(target: self, selector: #selector(processing))
displayLink?.add(to: RunLoop.main, forMode: .default)
displayLink?.preferredFramesPerSecond = 1
}
/// 定时器执行方法
@objc func processing() {
progress += 0.05
}
画个Shape留意到的东西的更多相关文章
- AD怎样画 board shape
先用随便那一层的线,画出你想要的边框的形状,圆角可通过shift+空格来切换出来选中你刚刚话的形状(要是闭合面),design-board sharp-define from selected obj ...
- 学习shader之前必须知道的东西之计算机图形学-渲染管线
引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...
- JAVA 画图板实现(基本画图功能+界面UI)二、功能实现及重绘实现
上篇博客中介绍了界面的实现方法,在这篇博客中将对每个按钮的功能的实现进行讲解并介绍重绘 首先肯定要添加事件监听机制了,那么问题来了,事件源对象是谁?需要添加什么方法?事件接口是什么? 1.我们需要点击 ...
- 学习shader之前必须知道的东西之计算机图形学(一)渲染管线
引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...
- 教你用开源 JS 库快速画出 GitHub 章鱼猫
本文作者:HelloGitHub-kalifun 在上一篇文章我们介绍了 Zdog 如何使用,接下来这篇文章我将带领各位利用 Zdog 画出一个 GitHub 章鱼猫(和官方的还是有些差别的). Zd ...
- Java的IO系统
Java IO系统 "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务." 由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...
- 从UWP到SWIFT-页面间反向传值
页面1跳转到页面2,在页面2点击button后,页面1的内容被改变.实际使用 protocol(就是c#中的interface),将页面1的viewcontroller转换为protocol传入页面2 ...
- Java 多态——与C++的比较
学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了.现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~ 一. Java的多态 ...
- web学习第一章
web学习第一章 我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...
- 自定义View_1_关于View,ViewGroup的测量和绘制流程
自定义View(1) ------ 关于View,ViewGroup的测量和绘制流程 在Android当中,自定义控件属于比较高级的知识体系,今天我们就一起研究研究关于自定义View的那点事,看看它到 ...
随机推荐
- ClickHouse-3引擎
引擎 数据库引擎 index 表引擎 数据库引擎 数据库引擎允许您处理数据表. 默认情况下,ClickHouse使用Atomic数据库引擎.它提供了可配置的table engines和SQL dial ...
- w3cschool-memcached教程
https://www.w3cschool.cn/memcached/ Memcached 教程 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. 手册简介 Memcached ...
- 快速修改MySQL数据库名称
原理:先创建新的数据库,然后利用information_schema数据库表结构信息,用 RENAME命令 将旧的表迁移到新数据库里面,最后删除旧的数据库名称即可. 步骤如下: #查询目标数据库下面的 ...
- LeetCode 未验证规则
1. for循环容易忘记break,很多提交不过,都是因为这个 2. 左右指针,思考起来比较复杂,但是以代码容易理解.code精简为主,不要在乎省下一两次运算时间 3. 左右指针,有时候以left & ...
- 接口的应用:代理模式(Proxy)
应用场景: 安全代理:屏蔽对真实角色的直接访问. 远程代理:通过代理类处理远程方法调用(RMI) 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象比如你要开发一个大文档查看软件,大文档中 ...
- 《SpringBoot》EasyExcel实现百万数据的导入导出
24年11月6日消息,阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布,将停止更新,未来将逐步进入维护模式,将继续修复Bug,但不再主动新增功能. EasyExcel 是一款知名的 ...
- 一篇关于c语言的大补帖
一晃今年又开始了,作为一个失意的中年技术男,现在的心境真的是五味杂陈.赶紧写一篇吧,我怕过了这个点,今年就在没有那个心情去写了. 因为是基础嘛,从事软件开发以来c或者c++相关的东西断断续续 也刷了差 ...
- flutter run出现 Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
1 今天flutter run出现下面这样的情况 > Task :prepareKotlinBuildScriptModel UP-TO-DATE Deprecated Gradle featu ...
- SOUI4中使用文件资源
一直以前SOUI中引用资源都是通过uires.idx中定义资源类型及路径,比如: <?xml version="1.0" encoding="utf-8" ...
- 探索未来之路,激发AI创新活力!“天翼云息壤杯”高校AI大赛北京区域赛开赛!
近年来,人工智能发展速度之快.辐射范围之广令人瞩目.今年的<政府工作报告>提出,深化大数据.人工智能等研发应用,开展"人工智能+"行动.AI充满了无限可能和潜力,未来还 ...