设置渐变色
在mac os x10.5及之后,有很简单的方法设置渐变色:
方法一:Using NSGradient
NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:
[NSColor colorWithDeviceRed:(float)255/255 green:(float)0/255 blue:(float)0/255 alpha:1.0],0.0,
[NSColor colorWithDeviceRed:(float)75/255 green:(float)75/255 blue:(float)75/255 alpha:1.0], 1.0,
nil];
填充到某一Bezierpath区域,可使用:
[gradient drawInBezierPath:path angle:0];
方法二:Using CGGradient
CGGradientRef myGradient;
CGColorSpaceRef myColorspace;
size_t num_locations = 2;
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = { 1.0, 0.5, 0.4, 1.0, // Start color
0.8, 0.8, 0.3, 1.0 }; // End color
myColorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations);
填充到某一区域,可使用:
CGPoint myStartPoint, myEndPoint;
CGContextRef myContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
myStartPoint.x = 0.0;
myStartPoint.y = 0.0;
myEndPoint.x = 1.0;
myEndPoint.y = 1.0;
CGContextDrawLinearGradient (myContext, myGradient, myStartPoint, myEndPoint, 0);
在未包含NSGradient 和CGGradient 的SDK(like mac os x 10.4)中,绘制渐变色可以采用这种方式:
方法三:Using CGShading
1)首先知道需要定义些什么:
CGPoint startPoint;
CGPoint endPoint;
CGColorSpaceRef colorspace;
CGFunctionRef myFunction;
CGShadingRef myShading;
CGContextRef myContext;
CGFloat myColors[12];
2)创建myFunction:
在创建myShading之前,需要先创建myFunction。(在myFunction中就是对渐变的具体实现)
首先需要看看创建一个myFunction对象需要哪些参数设置:
CGFunctionRef CGFunctionCreate(void *info, size_t domainDimension,
const CGFloat *domain, size_t rangeDimension, const CGFloat *range,
const CGFunctionCallbacks *callbacks)
这里最重要的就是那个callbacks。下面在看看这个callbacks是怎么构成的:
struct CGFunctionCallbacks
{
unsigned int version;
CGFunctionEvaluateCallback evaluate;
CGFunctionReleaseInfoCallback releaseInfo;
};
那么,先来写一个CGFunctionEvaluateCallback函数吧:
static void functionEvaluateCallbacks(void *info, const CGFloat *in, CGFloat *out)
{
CGFloat *colors = (CGFloat *)info;
*out++ = colors[0] + *in * colors[8];
*out++ = colors[1] + *in * colors[9];
*out++ = colors[2] + *in * colors[10];
*out++ = colors[3] + *in * colors[11];
}
那么现在,我们就可以完成callbacks这个参数了:
static const CGFunctionCallbacks callbacks = { 0,
&functionEvaluateCallbacks,
NULL };
回归主题,创建myFunction:
myColorspace = CGColorSpaceCreateDeviceRGB();
size_t components = 1 + CGColorSpaceGetNumberOfComponents(colorspace);
static const CGFloat domain[2] = {0.0, 1.0};
static const CGFloat range[10] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
myFunction = CGFunctionCreate(myColors, 1, domain, components, range, &callbacks);
这里用到的myColors[12]就是需要绘制渐变的颜色。这里用了12个元素的数组来表示,是因为用来设置渐变的两种颜色分别有四个元素(red,green,blue,alpha),另外剩余的四个单元用来存放这两种颜色每个元素之间的差异。在functionEvaluateCallbacks中可以看到,是根据这个差异来设置渐变的。
3)创建myShading对象:
同样的,先来看看创建一个CGShading对象需要做哪些准备工作:
CGShadingRef CGShadingCreateAxial(CGColorSpaceRef space,
CGPoint start,
CGPoint end,
CGFunctionRef function,
bool extendStart,
bool extendEnd)
设置好这些参数,就可以啦。
startPoint = CGPointMake(0,10);
endPoint = CGPointMake(0,100);
myShading = CGShadingCreateAxial(myColorspace, startPoint, endPoint, myFunction, NO, NO);
4)将设置好的myShading对象用来绘制对象
在这里,我将设置好的myShading用来填充当前区域。
myContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
CGContextSaveGState(myContext);
[self addClip];
CGContextDrawShading(myContext,myShading);
CGContextRestoreGState(myContext);
5)释放对象
CGShadingRelease(myShading);
CGFunctionRelease(myFunction);
CGColorSpaceRelease(myColorspace);