Shadows
陰影是在下面繪制的圖像蛇券,并與圖形對(duì)象相偏移,使陰影模仿投射在圖形對(duì)象上的光源的效果钦睡,如圖7-1所示钧嘶。文本也可以被跟蹤。陰影可以使圖像顯示為三維撰豺,或者看起來(lái)像漂浮的说庭。
陰影有三個(gè)特點(diǎn):
1、x-offset郑趁,它指定陰影在水平方向上與圖像偏移的距離刊驴。
2、y偏移量寡润,它指定陰影在垂直方向上偏移的距離捆憎。
3、模糊值梭纹,它指定圖像是否有硬邊(如圖7-2左邊所示)或漫射邊(如圖右側(cè)所示)躲惰。
本章描述了陰影是如何工作的,并展示了如何使用Quartz 2D API來(lái)創(chuàng)建它們变抽。
How Shadows Work
Quartz中的陰影是圖形狀態(tài)的一部分础拨。您可以調(diào)用函數(shù)CGContextSetShadow,傳遞圖形上下文绍载、偏移值和模糊值诡宗。設(shè)置好陰影后,你繪制的任何對(duì)象都有一個(gè)黑色的陰影击儡,在設(shè)備RGB顏色空間中有1/3的alpha值塔沃。換句話說(shuō),陰影是使用設(shè)置為{0,0,0,1.0/3.0}的RGBA值繪制的阳谍。
您可以通過(guò)調(diào)用函數(shù)CGContextSetShadowWithColor來(lái)繪制彩色陰影蛀柴,傳遞圖形上下文、偏移值矫夯、模糊值和CGColor對(duì)象鸽疾。為顏色提供的值取決于您想要繪制的顏色空間。
如果您在調(diào)用CGContextSetShadow或CGContextSetShadowWithColor之前保存了圖形狀態(tài)训貌,那么您可以通過(guò)恢復(fù)圖形狀態(tài)來(lái)關(guān)閉陰影制肮。您還可以通過(guò)將陰影顏色設(shè)置為NULL來(lái)禁用陰影。
Shadow Drawing Conventions Vary Based on the Context
前面描述的偏移量指定陰影與投射陰影的圖像相關(guān)的位置。這些偏移量由上下文解釋并用于計(jì)算陰影的位置:
1弄企、正的x偏移量表示陰影在圖形對(duì)象的右側(cè)。
2区拳、在Mac OS X中拘领,正的y偏移量表示向上的位移。這與Quartz 2D的默認(rèn)坐標(biāo)系統(tǒng)相匹配樱调。
3约素、在iOS中,如果您的應(yīng)用程序使用Quartz 2D api創(chuàng)建PDF或位圖上下文笆凌,一個(gè)正的y偏移表示向上位移圣猎。
4、在iOS中乞而,如果圖形上下文是由UIKit創(chuàng)建的送悔,例如由UIView對(duì)象創(chuàng)建的圖形上下文或通過(guò)調(diào)用UIGraphicsBeginImageContextWithOptions函數(shù)創(chuàng)建的上下文,那么一個(gè)正的y偏移表示向下位移爪模。這與UIKit坐標(biāo)系的繪圖約定相匹配欠啤。
5、陰影繪制約定不受當(dāng)前轉(zhuǎn)換矩陣的影響屋灌。
Painting with Shadows
按照以下步驟畫(huà)陰影:
1洁段、保存圖形狀態(tài)。
2共郭、調(diào)用函數(shù)CGContextSetShadow祠丝,傳遞適當(dāng)?shù)闹怠?br>
3、執(zhí)行您想要應(yīng)用陰影的所有繪圖除嘹。
4写半、恢復(fù)圖像的狀態(tài)。
按照以下步驟畫(huà)出彩色陰影:
1尉咕、保存圖形狀態(tài)污朽。
2、創(chuàng)建一個(gè)CGColorSpace對(duì)象龙考,以確保Quartz正確地解釋了陰影顏色值蟆肆。
3、創(chuàng)建一個(gè)指定要使用的陰影顏色的CGColor對(duì)象晦款。
4炎功、調(diào)用CGContextSetShadowWithColor函數(shù),傳遞適當(dāng)?shù)闹怠?br>
5缓溅、執(zhí)行您想要應(yīng)用陰影的所有繪圖蛇损。
6、恢復(fù)圖像的狀態(tài)。
圖7-3中的兩個(gè)矩形是用陰影繪制的——一個(gè)帶有彩色陰影淤齐。
void MyDrawWithShadows (CGContextRef myContext, // 1
CGFloat wd, CGFloat ht);
{
CGSize myShadowOffset = CGSizeMake (-15, 20);// 2
CGFloat myColorValues[] = {1, 0, 0, .6};// 3
CGColorRef myColor;// 4
CGColorSpaceRef myColorSpace;// 5
CGContextSaveGState(myContext);// 6
CGContextSetShadow (myContext, myShadowOffset, 5); // 7
// Your drawing code here// 8
CGContextSetRGBFillColor (myContext, 0, 1, 0, 1);
CGContextFillRect (myContext, CGRectMake (wd/3 + 75, ht/2 , wd/4, ht/4));
myColorSpace = CGColorSpaceCreateDeviceRGB ();// 9
myColor = CGColorCreate (myColorSpace, myColorValues);// 10
CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor);// 11
// Your drawing code here// 12
CGContextSetRGBFillColor (myContext, 0, 0, 1, 1);
CGContextFillRect (myContext, CGRectMake (wd/3-75,ht/2-100,wd/4,ht/4));
CGColorRelease (myColor);// 13
CGColorSpaceRelease (myColorSpace); // 14
CGContextRestoreGState(myContext);// 15
}
下面是代碼的作用:
1股囊、使用三個(gè)參數(shù)——圖形上下文和用于構(gòu)造矩形的寬度和高度。
2更啄、聲明并創(chuàng)建一個(gè)包含陰影偏移值的CGSize對(duì)象稚疹。這些值在對(duì)象的左邊指定一個(gè)陰影偏移量15個(gè)單位,在對(duì)象的上面指定20個(gè)單位祭务。
3内狗、聲明一個(gè)顏色值數(shù)組。這個(gè)示例使用RGBA义锥,但是這些值在傳遞給Quartz和顏色空間(Quartz正確解釋這些值是必要的)之前不會(huì)有任何意義柳沙。
4、為顏色引用聲明存儲(chǔ)拌倍。
5赂鲤、為顏色空間引用聲明存儲(chǔ)。
6柱恤、保存當(dāng)前圖形狀態(tài)蛤袒,以便稍后恢復(fù)。
7膨更、設(shè)置陰影妙真,使其具有先前聲明的偏移值和模糊值5,這表示陰影邊緣較軟荚守。陰影將顯示為灰色珍德,具有{0,0,0,1 /3}的RGBA值。
8矗漾、接下來(lái)的兩行代碼繪制了圖7-3右側(cè)的矩形锈候。您可以用自己的繪圖代碼替換這些行。
9敞贡、創(chuàng)建一個(gè)設(shè)備RGB顏色空間泵琳。在創(chuàng)建CGColor對(duì)象時(shí),需要提供一個(gè)顏色空間誊役。
10获列、創(chuàng)建一個(gè)CGColor對(duì)象,提供設(shè)備RGB顏色空間和前面聲明的RGBA值蛔垢。該對(duì)象指定陰影顏色击孩,在本例中為紅色,alpha值為0.6鹏漆。
11巩梢、設(shè)置顏色陰影创泄,提供剛剛創(chuàng)建的紅色。陰影使用之前創(chuàng)建的偏移量括蝠,模糊值為表示陰影邊緣較軟鞠抑。
12、接下來(lái)的兩行代碼繪制了圖7-3左邊的矩形忌警。您可以用自己的繪圖代碼替換這些行搁拙。
13、釋放color對(duì)象慨蓝,因?yàn)椴辉傩枰?br>
14感混、釋放顏色空間對(duì)象端幼,因?yàn)椴辉傩枰?br>
15礼烈、將圖形狀態(tài)恢復(fù)到設(shè)置陰影之前的狀態(tài)。