Core Animation(一)iOS图形和动画的初步认识

时间:2021-11-08 23:29:44

一、行业及平台情况分析

在中国,一些发达城市,例如北、上、广、深,都处于经济高速发展阶段,而人们的生活也越发的忙碌,时间高度碎片化,所以人们没有很多时间坐在PC前,而都改用移动设备,甚至现在一些大公司的部分办公都依靠移动设备,所以移动开发是将来一段时间的必然趋势。

移动平台主要有iOS、Android以及其他,iOS一般定位于高端用户,Android面向高中低端用户,但高端用户较iOS偏少,甚至异性相亲中,男女使用的移动设备也间接表达了一个人的品味。

目前国内IT企业大多都会做移动端产品,iOS平台的移动产品以友好的用户体验,深受用户喜欢,Android平台也在不断的努力追赶,但同样的产品在iOS平台上实现的很炫酷,而Android平台就要差很多?原因就在于iOS平台本身提供了很多易于构建友好用户体验的基本工具,开发者们等于站在了巨人的肩膀上去做事情,所以有必要学习下iOS平台的图形和动画相关的知识。


二、下面逐一介绍

1、Core Graphics

(1)Core Graphics是一组是基于C的API,是iOS平台用来绘制2D图形,并使用CPU进行计算。 包含于CoreGraphics.framework框架中,新建一个项目时,模板已经自动载入。

(2)Core Graphics 和Quartz 2D的区别
quartz是一个通用的术语,用于描述在iOS和MAC OS X中整个媒体层用到的多种技术,包括图形、动画、音频、适配。
Quart 2D 是一组二维绘图和渲染API,Core Graphic使用到这组API。

(3)点和像素
系统拥有坐标系(iOS坐标系统的原点在左上角,Mac OS X的坐标系统原点在左下角),如320*480 硬件有retain屏幕和非retain屏:如320*480、640*960
Core Graphics 使用的是系统的坐标系来绘制图片。在分辨率为640*960手机上绘制图片时,实际上Core Graphics 的坐标是320*480。这个时候每个坐标系上的点,实际上拥有两个像素,这里也是Apple为了开发者方便,引入了“点宽”的概念。

(4)图形上下文
Core Graphics 使用图形上下文进行工作,这个上下文的作用像画家的画布一样。 在图形上下文之外是无法绘图的,我们可以自己创建一个上下文,但是性能和内存的使用上,效率是非常低。
我们可以通过派生一个UIView的子类,获得它的上下文。在UIView中调用drawRect:方法时,会自动准备好一个图形上下文,可以通过调用
UIGraphicsGetCurrentContext()来获取。 因为它是运行期间绘制图片,我们可以动态的做一些额外的操作。

(5)Core Graphics的优点
使用Core Graphics可以达到快速、高效,减小应用的文件大小的效果。同时可以*地使用动态的、高质量的图形图像。 还可以创建直线、路径、渐变、文字与图像等内容,并可以做变形处理。这点上Android目前是无法比拟的,所以Android项目开始时候一般都使用图片替代,而不会使用Java自带的绘图库,因为那样会导致效率低下。


2、Core Animation

Core Animation包含于QuartzCore.framwork中,是iOS与OS X平台上负责图形渲染与动画的基础设施,可以实现视图和其他的可视元素的动画,是一组相对UIKit和动画绘制和动画*度更大的API,构建于Core Graphics之上。iOS上的UIKit和动画效果大部分都是通过Core Animation实现的。

Core Animation(一)iOS图形和动画的初步认识

Core Animation位于UIKit的底层。它被紧密的集成到了Cocoa和Cocoa Touch视图工作流中。Core Animation自身并不是一个绘图系统。它只是一个负责在硬件上合成和操纵应用内容的基础构件,只要做过iOS开发的都使用到了Core Animation,例如操作UIView的时候,修改其某些属性,iOS系统会自动生成“隐式动画”(动画持续时间大约0.25s),当然想要做出更加绚丽的效果,还是要自己定义动画了,自己创建的动画称为“显示动画”,Core Animation更多的内容后续将会提到。


3、Core Image

Core Image是一组用于图像、视频处理的API,如添加滤镜之类的。Core Image是一个很强大的框架。它可以让你简单地应用各种滤镜来处理图像,比如修改鲜艳程度, 色泽, 或者曝光。 它利用GPU(或者CPU)来非常快速、甚至实时地处理图像数据和视频的帧。在OS X上,可以使用Core Image过滤器创建使用特效类型,比如擦除、翻页、波纹、或你设计的自定义特效的过渡。因为主要学习iOS,所以这里不多了解Core Image了。


4、OpenGL / OpenGL ES

Open Graphics Library(OpenGL)用于二维及三维数据的可视化。它是一种多用途的开放标准图形库,支持二维和三维数位内容创作,底层的图形绘制API,*度最大。因为底层硬件专门处理图形命令,所以OpenGL绘图非常快。

OpenGL for Embedded Systems (OpenGL ES)是OpenGL的一个简化版本,消除冗余的功能,而且是基于C的应用程序接口,可移植性好,使用广泛,既容易学习也容易实践在移动装置上。 可与基于Objective-C的CocoaTouch应用程序无缝集成。

OpenGL ES是Core Animation实现的一部分。 当开发OpenGL ES应用程序,OpenGL ES内容会被绘制在一个特殊的Core Animation层,这个层被称为CAEAGLLayer对象。用OpenGLES绘制的图片会被储存在CAEAGLLayer中。CoreAnimation组合其它层的图形内容并显示最后结果在萤幕上。


三、实践

下面是一个Demo,简单的使用了Core Graphics和Core Animation,以下是关键代码:

利用Core Graphics绘制UIView

- (void)drawRect:(CGRect)rect {
// 绘制背景
UIImage *image = [UIImage imageNamed:@"image_a.png"];
[image drawInRect:rect];

// 绘制矩形
CGRect rectangle = CGRectMake(10, 30, 300, 60);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextAddRect(ctx, rectangle);
CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextFillPath(ctx);
}
Core Animation(一)iOS图形和动画的初步认识

利用Core Animation实现一个简单的动画(单击一下屏幕就可以看到动画)

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
CGFloat X = 123;
CGFloat Y = 140;
CGFloat W = 43;

UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(X, Y, W, W)];
btn.backgroundColor = [UIColor greenColor];
[self.view addSubview:btn];


CGRect boundingRect = CGRectMake(W - (X + W), W - (Y + W), 300, 300);

CAKeyframeAnimation *orbit = [CAKeyframeAnimation animation];
orbit.keyPath = @"position";
orbit.path = CFAutorelease(CGPathCreateWithEllipseInRect(boundingRect, NULL));
orbit.duration = 4;
orbit.additive = YES;
orbit.repeatCount = HUGE_VALF;
orbit.calculationMode = kCAAnimationPaced;
orbit.rotationMode = kCAAnimationRotateAuto;

[btn.layer addAnimation:orbit forKey:@"orbit"];
}


总结:接下来主要研究Core Animation,但Core Animation基于Core Graphics和OpenGL,所以以上内容都要了解一些,平时开发中,简单的动画可以使用UIKit动画就满足要求了,UIKit动画是高级API,封装了Core Animation,所以使用起来方便,但功能也就局限了。


Demo下载