当前位置: 首页 > news >正文

Quartz2D之Path使用初步

我们直接看以下代码:

//
//  MyQuartzView.m
//  QuartzTest
//
//  Created by zenny_chen on 12-2-21.
//  Copyright (c) 2012年 GreenGames Studio. All rights reserved.
//#import "MyQuartzView.h"// Quartz2D以及Core Animation所需要的头文件
#import <QuartzCore/QuartzCore.h>@implementation MyQuartzView- (id)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {// Initialization code}return self;
}// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{// Drawing code// 创建Quartz上下文CGContextRef context = UIGraphicsGetCurrentContext();// 填充矩形CGContextSetRGBFillColor(context, 0.6f, 0.6f, 0.6f, 1.0f);CGContextFillRect(context, CGRectMake(0.0f, 0.0f, 320.0f, 460.0f));// 创建一个Path句柄CGMutablePathRef pathRef = CGPathCreateMutable();// 初始化该path到一个初始点CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);// 添加一条直线,从初始点到该函数指定的坐标点CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);// 关闭该pathCGPathCloseSubpath(pathRef);// 设置描边颜色CGContextSetRGBStrokeColor(context, 0.99f, 0.01f, 0.02f,1.0f);// 将此path添加到Quartz上下文中CGContextAddPath(context, pathRef);// 对上下文进行描边CGContextStrokePath(context);// 释放该pathCGPathRelease(pathRef);
}@end

Quartz2D 中对 Path 的绘制过程与 OpenVG 几乎一样。首先是创建 Path,然后是对 Path 做绘制描述,最后是 绘制PaintPath

以上要注意的是,创建完一个 Path 句柄后,必须调用一次 CGPathMoveToPoint 来初始化绘制的初始点。

在调用 CGPathMoveToPoint 后,它会终止当前的子 Path,并重新开启一个子 Path。而一个子 Path,其默认行为会构成一个封闭图形,比如以下代码:

// 创建一个Path句柄
CGMutablePathRef pathRef = CGPathCreateMutable();// 初始化该path到一个初始点
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);// 添加一条直线,从初始点到该函数指定的坐标点
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);// 关闭该path
CGPathCloseSubpath(pathRef);

添加了两条直线,但是最终绘制出来的是一个封闭的三角形。

如果我们要画两条均以 (0, 0) 为其中一个端点的线段的话,我们可以这么做:

// 创建一个Path句柄
CGMutablePathRef pathRef = CGPathCreateMutable();// 初始化该path到一个初始点
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);// 添加一条直线,从初始点到该函数指定的坐标点
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);// 关闭该path
CGPathCloseSubpath(pathRef);

如果我们要从 (0, 0) 到 (50, 100) 画一条线段,然后再要从 (50, 100) 到 (100, 50) 画一条线段的话,可以这么做:

CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);

各位可以看看效果。

http://www.lryc.cn/news/66211.html

相关文章:

  • Adobe考试
  • 三线城市程序员的薪资待遇怎么样?我分享提高java技术水平的几个方法
  • 马哈鱼SQLFLow对SQL Server OUTPUT Clause 的数据血缘分析
  • 5/8~5/9总结
  • java 数组创建的方法
  • HID Relay, 有线键盘转蓝牙项目学习:记一次失败的尝试
  • 天猫数据分析:2023年Q1天猫净水器品牌销售TOP10排行榜
  • TweenMax 源码阅读
  • B/S医院手术麻醉管理系统源码:麻醉知情同意书模板
  • postman 的 console 窗口,助力 http 请求错误时的问题排查
  • 破事精英2◎爬向未来
  • java中session各种使用场景实例,这篇文章就够了。
  • 【AWS入门】利用CloudWatch监控EC2的CPU负载情况
  • 如何使用AndroidStudio编写Java程序
  • 如何充分利用实时聊天系统?
  • [C++基础]-类和对象(下)
  • NP完全性PART1:多项式时间与形式化语言体系
  • 685页40万字某省市场监管智慧应用一体化项目(word可编辑)
  • 【cutlass】cuTe 01 layout
  • 迁移学习
  • 基于session实现共享登录
  • Hudi学习笔记1
  • 嚯——ChatGPT是很强,但也会胡说八道。。。
  • Springboot常用注解总结
  • 让chatGPT给我写一个CSS,我太蠢了
  • 华为OD题目:分奖金
  • 【算法题】2401. 最长优雅子数组
  • 【Vue】Vue快速入门
  • 二本菜鸡,颓废两年的自我救赎
  • Spring boot 常用注解