Quartz2D提供了兩種漸變填充方法。第一種是使用Quartz自帶的Gradient填充方法;第二種是使用自定義的着色器。
這里將先描述如何使用CGGradient對象來做漸變填充。
// Drawing code
// 創建Quartz上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 創建色彩空間對象
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
// 創建起點顏色
CGColorRef beginColor = CGColorCreate(colorSpaceRef, (CGFloat[]){0.01f, 0.99f, 0.01f, 1.0f});
// 創建終點顏色
CGColorRef endColor = CGColorCreate(colorSpaceRef, (CGFloat[]){0.99f, 0.99f, 0.01f, 1.0f});
// 創建顏色數組
CFArrayRef colorArray = CFArrayCreate(kCFAllocatorDefault, (const void*[]){beginColor, endColor}, 2, nil);
// 創建漸變對象
CGGradientRef gradientRef = CGGradientCreateWithColors(colorSpaceRef, colorArray, (CGFloat[]){
0.0f, // 對應起點顏色位置
1.0f // 對應終點顏色位置
});
// 釋放顏色數組
CFRelease(colorArray);
// 釋放起點和終點顏色
CGColorRelease(beginColor);
CGColorRelease(endColor);
// 釋放色彩空間
CGColorSpaceRelease(colorSpaceRef);
CGContextDrawLinearGradient(context, gradientRef, CGPointMake(0.0f, 0.0f), CGPointMake(320.0f, 460.0f), 0);
// 釋放漸變對象
CGGradientRelease(gradientRef);
上述代碼效果將產生一個由綠到藍的一個漸變填充矩形。
這里使用了CGColor和CFArray來作為設置漸變顏色的參數。另外, CGGradientCreateWithColors的最后一個locations參數可以傳空,這樣默認為從0.0到1.0。
以上畫的是兩種顏色的漸變,是由綠到靛藍。下面我們來看一下三層顏色的漸變:
// 創建Quartz上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 創建色彩空間對象
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
// 創建漸變對象
CGGradientRef gradientRef = CGGradientCreateWithColorComponents(colorSpaceRef,
(CGFloat[]){
0.01f, 0.99f, 0.01f, 1.0f,
0.01f, 0.99f, 0.99f, 1.0f,
0.99f, 0.99f, 0.01f, 1.0f
},
(CGFloat[]){
0.0f,
0.5f,
1.0f
},
3);
// 釋放色彩空間
CGColorSpaceRelease(colorSpaceRef);
// 填充漸變色
CGContextDrawLinearGradient(context, gradientRef, CGPointMake(0.0f, 0.0f), CGPointMake(320.0f, 460.0f), 0);
// 釋放漸變對象
CGGradientRelease(gradientRef);
上述代碼繪制了三種顏色的漸變色,由綠到靛藍到黃色。並且在45度軸方向上的顏色都是一樣的。
當然,我們也可以通過改變矩形兩點坐標的位置來改變漸變軸的方向,並且也可以設置關鍵顏色的位置:
// 創建Quartz上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 創建色彩空間對象
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
// 創建漸變對象
CGGradientRef gradientRef = CGGradientCreateWithColorComponents(colorSpaceRef,
(CGFloat[]){
0.01f, 0.99f, 0.01f, 1.0f,
0.01f, 0.99f, 0.99f, 1.0f,
0.99f, 0.99f, 0.01f, 1.0f
},
(CGFloat[]){
0.1f,
0.5f,
0.9f
},
3);
// 釋放色彩空間
CGColorSpaceRelease(colorSpaceRef);
// 填充漸變色
CGContextDrawLinearGradient(context, gradientRef, CGPointMake(0.0f, 460.0f), CGPointMake(320.0f, 0.0f), 0);
// 釋放漸變對象
CGGradientRelease(gradientRef);
運行上述代碼后我們可以發現,漸變軸被旋轉了90度。而且藍色與黃色區域也有所增大,更靠近矩形的中心。
