设置渐变色

设置渐变色

在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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值