主要是3种方式,Core Animation、Core Graphic和OpenGL ES。
操作简易度:CA>CG>OpenGL
性能和功能度:OpenGL>CG>CA
1.Core Animation
非娱乐类的软件都会用到的动画,操作简单。
2.Quartz 2D绘图
是一个2D绘图引擎。
(1) 绘图Context是一个绘图的目标对象,定义了绘图的基本属性,如颜色、绘图范围、线宽及样式等。
(2)通过UIView会创建Context,可以用类似如下的语句来得到当前的Context.
CGContextRef currentContext = UIGraphicsGetCurrentContext();
(3)如果在对其进行修改前想要保存当前状态,可以使用UIGraphicsPushContext;
要恢复保存过的Context,则可用UIGraphicsPopContext。
(4)path,路径其实就是用一系列坐标点标识出来的一条曲线或折线,创建好之后就可以沿其画线,或者对封闭的空间进行填充。
通过一个简单的画板(白板)来熟悉 Quartz 2D绘图
添加一个Empty Application,新建一个UIView类
在AppDelegate中修改代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
//创建View,并指定View的大小为全屏
WhiteBoardView *whiteView = [[WhiteBoardView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.window addSubview:whiteView];//把创建的View作为子视图加入窗口
[whiteView release];
[self.window makeKeyAndVisible];
return YES;
}
修改UIView类中代码:
// DrawingBoard
#import <UIKit/UIKit.h>
@interface WhiteBoardView : UIView{
CGContextRef whiteBoardContext;
CGLayerRef whiteBoardLayer;
}
@end
实现类:
// DrawingBoard
#import "WhiteBoardView.h"
@implementation WhiteBoardView
//对进行重写,以便在视图初始化的时候创建并设置自定义的Context
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor whiteColor];//指定视图的背景色
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //指定色彩空间为RGB
//创建Bitmap Context,大小为View自身的大小
whiteBoardContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8,
4 *self.frame.size.width, colorSpace, kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace) ;
//创建新的CGLayer,用于画图
whiteBoardLayer = CGLayerCreateWithContext(whiteBoardContext, self.frame.size, NULL);
//得到新建层的Context
CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
//指定新建层Context的线宽
CGContextSetLineWidth(layerContext, 1.5);
CGContextSetLineCap(layerContext, kCGLineCapRound); //指定线头形状为圆形
CGContextSetRGBStrokeColor(layerContext, 0.0,0.0,0.0,1);//指定线的颜色,黑色
}
return self;
}
//对drawRect进行重写
- (void)drawRect:(CGRect)rect
{
//先得到当前的Context
CGContextRef currentContext = UIGraphicsGetCurrentContext();
//根据Context的内容生成Bitmap
CGImageRef image = CGBitmapContextCreateImage(whiteBoardContext);
//把Bitmap绘制到Context上
CGContextDrawImage(currentContext, [self bounds], image);
//把whiteBoardLayer也绘到当前Context中
CGContextDrawLayerInRect(currentContext , [self bounds], whiteBoardLayer);
}
//屏幕触摸事件 触摸开始
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *theTouch = [touches anyObject];//先得到touch对象
if ([theTouch tapCount] == 2)//判断是否为双击,是就清空图像
{
CGContextClearRect(whiteBoardContext, [self bounds]);//清空
[self setNeedsDisplay]; //刷新屏幕显示
}
else//如果不是双击,就按手指划动处理,结果是画出一个点
{
[self touchesMoved:touches withEvent:event];
}
}
//手指划动时画线的代码
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *theTouch = [touches anyObject];
//得到当前位置
CGPoint currentTouchLocation = [theTouch locationInView:self];
//得到上次位置
CGPoint lastTouchLoacation = [theTouch previousLocationInView:self];
//取得Context
CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
//开始定义Path
CGContextBeginPath(layerContext);
//把Path的起点移动到上次位置
CGContextMoveToPoint(layerContext, lastTouchLoacation.x, lastTouchLoacation.y);
//在上次位置和当前位置之间连线,并记入Path
CGContextAddLineToPoint(layerContext, currentTouchLocation.x, currentTouchLocation.y);
//沿Path画线
CGContextStrokePath(layerContext);
[self setNeedsDisplay]; //刷新屏幕
}
- (void)dealloc
{
CGContextRelease(whiteBoardContext);
CGLayerRelease(whiteBoardLayer);
[super dealloc];
}
@end
3.OpenGL ES编程
一般是三个步骤:
(1)在Context中绘图
(2)把Context中的内容送入framebuffer
(3)显示framebuffer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库