iOS上使用Quartz 2D绘制简单图形

转载自:http://blog.csdn.net/u014131398/article/details/38541481


绘制图形是通过重载UIView的 - ( void )drawRect:( CGRect )rect方法来实现的,所以首先需要一个继承自UIView的类,然后重写这个类的 - ( void )drawRect:( CGRect )rect方法。当我们使用这个类的对象时,view显示时回调自身的 drawRect方法,从而把我们会绘制在view上的东西呈现出来。 drawRect方法只有一个 CGRect  参数传入,这个值是view的frame。

   1、绘制直线:

CGContextRef context = UIGraphicsGetCurrentContext();  //首先构建一个context,所有绘制都需要的
  CGContextSetLineWidth(context, 2.0);  //设置线条的宽度
  CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor); //设置线条的颜色
  
  CGContextMoveToPoint(context, 10, 10);     //移动到某个点
  CGContextAddLineToPoint(context, CGRectGetMaxX(rect)-10, 10); //添加一条线,后两个参数提供一个新的点的坐标,结合上面的点,构成一条线段的两端。
  
  CGContextStrokePath(context);   //最后,绘制整个路径,前面的一系列移动、添加线条、点之类的可以说提供了一个路径,然后通过这个方法,把路径绘制出来。
   

context,我的理解中,它是一个配置参数的集合,比如线条颜色、线条宽度,一直绘制过程的整个路径都包含在里面,它贯通了整个绘制的过程,把各个参数结合到一起。

   而绘制的过程,其实很形象,比如上面绘制线段,可以想象是一支笔,先移动到点(10,10),然后移动到( CGRectGetMaxX (rect)- 10 , 10 ),但是方法是AddLine,也就是这个从一个点到另一个点得过程是构成一条线段的,就像是说你是按直线画过去的。

  2、绘制矩形:

   使用上面的绘制线段的方法当然可以拼接出一个矩形,但是矩形也有单独的方法。

CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-20));//就这一句话可以了,传入一个CGRect类型变量,提供矩形的范围,按这个范围画出矩形。
        
        CGContextStrokePath(context);

  3、绘制椭圆:

<span style="font-size:14px;">CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddEllipseInRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-100));</span><pre name="code" class="objc"><span style="font-size:14px;">//这个方法同样只提供了一个CGRect变量,也就是一个矩形区域,绘制出的椭圆和这个矩形四边相切。</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;">椭圆的形状靠长短轴的大小可以确定下来,矩形的长宽提供了,而矩形的中心确定了椭圆的中心,这样椭圆就可以确定下来了。</span></span>
CGContextStrokePath(context);

4、绘制圆形:

CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        CGContextAddArc(context, 160, 200, 100, M_PI/3.0, M_PI/2.0, 1);//绘制圆弧

        CGContextStrokePath(context);

CGContextAddArc   方法实际是一个绘制圆弧的方法,第一个参数传入context,第二个和第三个参数构成圆弧圆心的坐标,第四个参数是圆弧的半径,第五个参数是圆弧的开始角度,第六个参数是圆弧的结束角度,最后一个参数用来指定圆弧的方向,原本传入0是逆时针、1是顺时针,但是因为Quartz 2D的坐标系和UIView的坐标系是y轴相反的,所以1 是逆时针、0是顺时针。跳帧传入的起始、结束角度可以画出完整的圆。

绘制圆弧还有一个方法:

CGContextMoveToPoint(context, 10, 10);  //提供一个当前所在点
        CGContextAddArcToPoint(context, 10, 160, 40, 160,100);//绘制圆弧

这里的思路是,首先有三个点,假设为A,B,C,然后连接A,B构成一条线,B,C连接构成另一条线,而且两线交于B点,然后就画一个圆弧分别与两条线相切,并且半径等于指定的半径。所以需要3个点和一个半径。 CGContextAddArcToPoint 这个方法第二个和第三个参数提供一点B的坐标,第三个和第四个提供点C的坐标,而这是需要一个点A,当前点就是点A,所以需要一个当前点。

5、贝塞尔曲线:

CGContextAddCurveToPoint(CGContextRef c, CGFloat cp1x,
  CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)

贝塞尔曲线需要提供四个点,曲线的两个端点以及分别靠近两个端点的两个控制点,同样在调用这个绘制曲线的方法时,也需要有一个当前点,这个当前点会作为曲线的一个端点。方法最后两个参数构成另外一个端点的坐标。然后第二、第三和第四、第五个参数分别构成两个控制点。控制点并不处在曲线上。通过调节控制点,可以调节曲线的样式,从而满足对于各种曲线的要求。

6、绘制虚线:

CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetLineWidth(context, 2.0);
  const CGFloat lengths[] = {16.0f,6.0f,30.0f,40.0f};
  CGContextSetLineDash(context, 0, lengths, 4); //设置虚线的样式
  CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
  
  CGContextAddRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-20));
  
  CGContextStrokePath(context);
这里使用虚线绘制了一个矩形,虚线其实只需设置线条的属性即可,和上面说的图形绘制是两个不同方面的问题,可以同时使用。

对于虚线,关键的方法是

CGContextSetLineDash, 定义为:

void CGContextSetLineDash (
   CGContextRef c,
   CGFloat phase,
   const CGFloat lengths[],
   size_t count
);

lengths是一个float类型数组,count是数组里元素的数量。lengths指出了虚线的样式,例如

{16.0f,6.0f,30.0f,40.0f}

就是先长度为16的实线,然后空长度6,再是长度30的实线,再是空缺40长度,然后循环这个过程。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz.NET是一个非常流行的开源任务调度框架,可以帮助开发者实现定时任务、重复任务和异步任务的调度。本文将介绍Quartz.NET V2.6.2版本的简单使用。 1. 安装Quartz.NET 可以通过NuGet包管理器安装Quartz.NET,或者在Visual Studio中使用Package Manager Console命令: ``` Install-Package Quartz -Version 2.6.2 ``` 2. 创建任务 在Quartz.NET中,任务需要实现IJob接口。下面是一个简单的任务示例: ``` public class HelloJob : IJob { public async Task Execute(IJobExecutionContext context) { await Console.Out.WriteLineAsync("Hello, Quartz.NET!"); } } ``` 在Execute方法中编写任务逻辑,例如输出一句话。 3. 创建调度器 创建调度器需要使用SchedulerFactory和IScheduler接口。下面是一个简单的调度器示例: ``` // 创建调度器工厂 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 创建调度器 IScheduler scheduler = await schedulerFactory.GetScheduler(); // 开启调度器 await scheduler.Start(); ``` 4. 创建任务触发器 任务触发器需要指定任务的执行时间和执行频率。下面是一个简单的触发器示例: ``` // 创建任务触发器 ITrigger trigger = TriggerBuilder.Create() .WithIdentity("helloTrigger", "helloGroup") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(5) .RepeatForever()) .Build(); ``` 在上面的示例中,任务触发器每隔5秒钟执行一次。 5. 将任务和触发器绑定到调度器 将任务和触发器绑定到调度器需要使用JobDetail和Trigger接口。下面是一个简单的绑定示例: ``` // 创建任务 IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("helloJob", "helloGroup") .Build(); // 将任务和触发器绑定到调度器 await scheduler.ScheduleJob(job, trigger); ``` 6. 停止调度器 当不再需要调度器时,可以将其停止。下面是一个简单的停止示例: ``` // 停止调度器 await scheduler.Shutdown(); ``` 完整代码示例: ``` using System; using System.Threading.Tasks; using Quartz; using Quartz.Impl; namespace QuartzDemo { class Program { static async Task Main(string[] args) { // 创建调度器工厂 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 创建调度器 IScheduler scheduler = await schedulerFactory.GetScheduler(); // 开启调度器 await scheduler.Start(); // 创建任务触发器 ITrigger trigger = TriggerBuilder.Create() .WithIdentity("helloTrigger", "helloGroup") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(5) .RepeatForever()) .Build(); // 创建任务 IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("helloJob", "helloGroup") .Build(); // 将任务和触发器绑定到调度器 await scheduler.ScheduleJob(job, trigger); // 等待5分钟 await Task.Delay(TimeSpan.FromMinutes(5)); // 停止调度器 await scheduler.Shutdown(); } } public class HelloJob : IJob { public async Task Execute(IJobExecutionContext context) { await Console.Out.WriteLineAsync("Hello, Quartz.NET!"); } } } ``` 运行程序后,将会输出“Hello, Quartz.NET!”并且每隔5秒钟输出一次,持续5分钟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值