关情纸尾-----Quartz2D绘制圆形下载进度条,饼图

绘制下载进度条

1.搭建界面.

2.拖动滑竿的时候让他里面的能够跟着我的拖动,数字在改变.
  数字改变时有一个注意点, 就是要显示%,它是一个特殊的符号,要用两个%%代表一个%

3.拖动滑竿的时候就是在上面画弧.
  从最上面,按顺时针画,所以,它的起始角度是-90度.结束角度也是-90度
  也是从起始角度开始画,
  起始角度-90度, 看你下载进度是多少
  假如说你下载进度是100,就是1 * 360度
  也就是说这个进度占你360度多少分之一

  CGContextRef ctx = UIGraphicsGetCurrentContext();
  CGPoint center = CGPointMake(50, 50);
  CGFloat radius = rect.size.width * 0.5;
  CGFloat startA = -M_PI_2;
  CGFloat endA = -M_PI_2 + M_PI * 2 * progress;

  UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center 
                              radius:radius 
                            startAngle:startA 
                             endAngle:endA 
                             clockwise:YES];

  要获得Progress的值,这个进度值没有, 所以要传进来才能画.弄一个成员变量
  要在值改变的时候就要传进来.
  要拿到ProgressView才能够传进来,所以要拖线,拿到ProgressView
  所有都做好的, 发现没有画圆孤?
  为什么?
  问题:drawRect方法总共调用多少次?
  总共就调用一次, 第一次Progress为0,以后都不会执行了
  解决:每次传的时候,就要画一次,
  重写Progress方法
  -(void)setProgress:(CGFloat)progress{
    _progress = progress;  
    手动调用drawRect方法, 让它重新绘制
    [self setNeedsDisplay];
  }
  运行发现还是不画,为什么?
    原因:drawRect方法是不能手动调用,因为在drawRect方法中才能获取跟View相关联的上下文
    系统在调用DrawRect方法时,会自动帮你创建一个跟View相关联的上下文,并且传递给它.
    自己调用的,没有给drawRect方法传递上下文.所以在draw方法中拿不到上下文.

    解决办法:想要重绘,调用[self setNeedsDisplay];
    告诉系统重新绘制View,系统就会自动帮你调用drawRect方法,系统在调用
    drawRect方法,它会帮你创建上下文

绘制饼图

第一步, 获取上下文
第二步,拼接路径 ,绘制第一个扇形
获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGPoint center = CGPointMake(125, 125);
CGFloat radius = 100;
CGFloat startA = 0;
CGFloat endA = 0;
CGFloat angle = 25 / 100.0 * M_PI * 2;
endA = startA + angle;

拼接路径
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center 
radius:radius 
startAngle:startA 
endAngle:endA 
clockwise:YES];

添加一根线到圆心
[path addLineToPoint:center];
把路径添加到上下文
CGContextAddPath(ctx, path.CGPath);
把上下文渲染到View
CGContextFillPath(ctx);

注意点: CGFloat angle = 25 / 100.0 * M_PI * 2; 
100.0一定要加一个.0

绘制第二个扇形
一样的, 把路径描述第二个扇形就好了
直接来个path =
让Path指针重新指向一个新的对象.也就是把指针重复利用了
之前的那个对象已经用完了,已经添加到了上下文当中了.

第二个扇形
startA = endA;
angle = 25 / 100.0 * M_PI * 2;
endA = startA + angle;
path = [UIBezierPath bezierPathWithArcCenter:center
radius:radius 
startAngle:startA 
endAngle:endA 
clockwise:YES];
[path addLineToPoint:center];
把二个路径添加到上下文
CGContextAddPath(ctx, path.CGPath);
把上下文渲染到View
CGContextFillPath(ctx);

添加第二个扇形之后, 发现它们的颜色都一样,想要修改它的颜色
在下面再写一个
[[UIColor greenColor] set];
下面的一个颜色把之前的东西给覆盖了.
解决办法, 让它渲染两次

第三个扇形,把第二个拷贝一下就好了

总结:
有没有发现在画三个扇形用太多代码了,
里面有很多代码相似.
是不是可以把代码给抽一下
可以用便利数组的的方式
发现就两个地方变了, 一个数字变了, 一个颜色变了.

抽取代码:
假设他给一组数据
NSArray datas = @[@25,@25,@50];
把数组便利出来

NSArray *datas = @[@25,@25,@50];

CGPoint center = CGPointMake(125, 125);
CGFloat radius = 100;
CGFloat startA = 0;
CGFloat angle = 0;
CGFloat endA = 0;

for (NSNumber *number in datas) {

startA = endA;
angle = number.intValue / 100.0 * M_PI * 2;
endA = startA + angle;

描述路径
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center 
radius:radius
startAngle:startA
endAngle:endA
clockwise:YES];

[path addLineToPoint:center];
[[self randomColor] set];
[path fill];

}

- (UIColor *)randomColor{
CGFloat r = arc4random_uniform(256)/ 255.0;
CGFloat g = arc4random_uniform(256)/ 255.0;
CGFloat b = arc4random_uniform(256)/ 255.0;
return [UIColor colorWithRed:r green:g blue:b alpha:1];

}

随机颜色:alpha通道它的取值范围是0-255;
OC里面的取值范围只能是0到1,把它 / 255.0就让它到这个范围了,
arc4random_uniform(256)随机产生 0 - 255的数.
颜色通道它的取值范围是0 到 255.
所以说要把0 到 255转换成0 到 1
直接是 0 ~ 255 / 255.0就可以了.
刚好是255就是255 / 255.0 就是1,
刚才是0 就是 0 / 255.0 就是0.

时间: 2024-08-21 17:37:35

关情纸尾-----Quartz2D绘制圆形下载进度条,饼图的相关文章

关情纸尾-----Quartz2D绘制下载进度条,饼图

绘制下载进度条 1.搭建界面. 2.拖动滑竿的时候让他里面的能够跟着我的拖动,数字在改变. 数字改变时有一个注意点, 就是要显示%,它是一个特殊的符号,要用两个%%代表一个% 3.拖动滑竿的时候就是在上面画弧. 从最上面,按顺时针画,所以,它的起始角度是-90度.结束角度也是-90度 也是从起始角度开始画, 起始角度-90度, 看你下载进度是多少 假如说你下载进度是100,就是1 * 360度 也就是说这个进度占你360度多少分之一 CGContextRef ctx = UIGraphicsGe

关情纸尾-----Quartz2D基本线条绘制

1.DrawRect方法作用?什么时候调用? DrawRect作用:专用在这个方法当中绘图的.只有在这个方法当中才能取得跟View相关联的上下文. DrawRect是系统自己调用的, 它是当View显示的时候自动调用. 2.画线(基本步骤描述) 2.1获取跟View相关联的上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); 2.2绘制路径 UIBezierPath *path = [UIBezierPath bezierPath]; 2.2

关情纸尾-----Quartz2D简介

1.什么是Quartz2D? 他是一个二维的绘图引擎,同时支持iOS和Mac系统 2.Quartz2D能完成的工作? 画基本线条,绘制文字,图片,截图,自定义UIView. 3.Quartz2D在开发中的价值? 当我们的控件样式极其复杂时,可以把控件内部的结构给画出画,就是自定义控件. 4.什么是图形上下文,上下文的类型有哪些? 图形上下文是用来保存用户绘制的内容状态,并决定绘制到哪个地方的. 用户把绘制好的内容先保存到图形上下文, 然后根据选择的图形上下文的不同,绘制的内容显示到地方也不相同,

关情纸尾-----Quartz2D定时器CADisplayLink下雪效果

定时器CADisplayLink下雪效果 1.定时器雪花整体思路: 先在控制器View面绘制一个雪花. 在View加载完毕后,添加一个定时器. 在定时器方法当中调用得绘方法. 在绘图方法当不段的去修改雪花的Y值. 当雪花的Y值超过屏幕的高度时,让雪花的Y值重新设为0.从最顶部开始. 2.添加定时器实现方案 第一种采用NSTime 第二种采用CADisplayLink 最终采用CADisplayLink方案. 2.1为什么采用CADisplayLink方案不用NSTime? 首先要了解setNee

关情纸尾-----Quartz2D模仿系统的UIImageView

模仿系统的UIImageView 整体思路: 我们想要模仿系统的UIImageView,我们必须得要知道系统的UIView怎么用. 第一种用法 系统的用法是创建一个UIImageView对象,设置frame,给它传递一个UIImage,再把它添加到一个View上面就可以了. 可以切换图片. 第二种用法就是在创建的时候直接传递一个UIImage对象,使用initWithImage的方法进行创建一个UImageView的方式 用这种做法创建出来的UIImageView它的尺寸大小和原始图片的尺寸大小

在DrawingVisual上绘制圆形的进度条,类似于IOS系统风格。

1.说明:在WPF中,文件下载时需要显示下载进度,由于系统自带的条型进度条比较占用空间,改用圆形的进度条,需要在DrawingVisual上呈现. 运行的效果如图: private Point GetPointOnCir(Point CenterPoint, double r, double angel) { Point p = new Point(); p.X = Math.Sin(angel * Math.PI / 180) * r + CenterPoint.X; p.Y = Center

仿IOS圆形下载进度条

/** * Created by C058 on 2016/5/25. */ public class MyHoriztalProgressBar extends ProgressBar { private static final int DEFAULT_REACH_COLOR = 0xff24F569; private static final int DEFAULT_UNREACH_COLOR = 0xffC0C0C0; private static final int DEFAULT_R

关情纸尾-----Quartz2D-图片添加水印

给图片水印的目的: 告诉别人图片的来源. 防止别人盗用图片.打广告. 添加水印它最终是生成了一个新的图片. 生成图片要用到了图片上下文.不需要再去自定义View, 之前一直在自定义View,是因为要拿跟View相关联的上下文. 跟View相关联的上下文是系统自动帮我们创建的,所以不需要我们自己手动创建, 但是图片上下文需要我们自己去手动创建.还需要我们自己手动去关闭. 实现水印效果的思路: 开启一个和原始图片一样的图片上下文. 把原始图片先绘制到图片上下文. 再把要添加的水印(文字,logo)等

关情纸尾-----UIKit绘图演练

一般使用UIKit给我们提供的绘图来绘制一些文字,图片这些东西. UIKit给我们提供画图的方法底层也是分为四步.所以也必须在drawRect方法当中去写. 1.如何画文字? 先创建好要画的文字 使用UIKit提供的方法进行绘制. 方法说明: drawAtPoint:要画到哪个位置 withAttributes:文本的样式. [str drawAtPoint:CGPointZero withAttributes:nil]; 2.如何添加绘制文字属性? 通过绘制方法的最后一个属性withAttri