Transparency Layers (透明性层 / 透层)
一个透层是由两个或者更多对象组成的混合图形,混合后的结果被视为一个对象.
当想要将效果应用于一组对象时,透层特别有用.例如给三个圆形应用阴影.
如果不使用透层渲染应用三个圆形的阴影,结果是这样滴
image.png
透层如何工作
Quartz
透层的概念(Quartz transparency layers)与一些流行的图像应用程序中的可用的层的概念类似. 层(layers)
是独立的实体. Quartz 为每一个 context 管理一个透层栈(transparency layer stack) 并且透层是可以嵌套的.但是因为层也是栈的一部分,不能独立的管理他们(层).
调用CGContextBeginTransparencyLayer
函数标志着透层的开始 ,CGContextBeginTransparencyLayer
有两个参数 graphics context
和 CFDictionary object
. 字典参数让你提供选项来指定层的额外信息,但由于Quartz 2d API尚未使用字典,因此您将传递null. 在调用之后,图形的状态参数保持不变 除了 alpha
,shadow
,blendmode
,和其它影响最终合成的参数.
在你创建了一个透层之后,你可以在透层上显示任何你想显示的图形.在特定上下文上的绘制操作将混合在一起绘制到一个完全透明的背景中. 此背景作为上下文独立的目标缓冲区.
结束绘制之后,你可以调用 CGContextEndTransparencyLayer
函数, Quartz
使用上下文中全局 alpha, shadow state,和上下文中裁剪区域混合结果到上下文中.
向透层中绘制 (Painting to a Transparency Layer)
向透层中绘制需要三个步骤
- 1.调用函数
CGContextBeginTransparencyLayer
函数 - 2.绘制你想要混合到透层上的元素
- 3.调用
CGContextEndTransparencyLayer
函数
下面是实现代码:
void MyDrawTransparencyLayer (CGContext myContext, // 1
CGFloat wd,
CGFloat ht)
{
CGSize myShadowOffset = CGSizeMake (10, -20);// 2
CGContextSetShadow (myContext, myShadowOffset, 10); // 3
CGContextBeginTransparencyLayer (myContext, NULL);// 4
// Your drawing code here// 5
CGContextSetRGBFillColor (myContext, 0, 1, 0, 1);
CGContextFillRect (myContext, CGRectMake (wd/3+ 50,ht/2 ,wd/4,ht/4));
CGContextSetRGBFillColor (myContext, 0, 0, 1, 1);
CGContextFillRect (myContext, CGRectMake (wd/3-50,ht/2-100,wd/4,ht/4));
CGContextSetRGBFillColor (myContext, 1, 0, 0, 1);
CGContextFillRect (myContext, CGRectMake (wd/3,ht/2-50,wd/4,ht/4));
CGContextEndTransparencyLayer (myContext);// 6
}
代码的作用:
- 采用三个参数-图形上下文以及在构造矩形时要使用的宽度和高度。
- 设置一个CGsize 用来 指定阴影的偏移
- 设置阴影,指定
blur value
为10(值为0指定一个没有模糊的硬边阴影)
- 设置阴影,指定
- 发送创建 透层的信号,从现在开始,绘制发生在透层上.
- 下面的6行代码设置三个矩形区域并填充颜色,你可以把这六行代码替换成自己的
- 发送透层结束信号使 Quartz 在上下文上混合结果.
网友评论