核心图形:使用正常渐变绘制路径
网上有很多关于如何使用渐变绘制 - 填充或描边的资源。
然而,AFAICT没有涉及以下要求:如何绘制一条具有正常梯度的路径,其中正常方式与路径正交。 当使用暗 - >亮 - >暗线性梯度时,净效应可能像牙膏或管。 在圆形矩形的情况下,这是这个想法:
圆形管http://muys.net/cadre_blanc.png
(这是手绘,角落不是很好)。
在圆形矩形的具体情况下,我认为我可以用4个线性梯度(边)和4个径向梯度(边角)实现这种效果。 但是有更好的吗?
是否有任何路径的简单解决方案?
我能想到的唯一“简单”解决方案是多次对路径进行描边,减少笔画宽度并每次稍微改变颜色,以模拟渐变。
显然,对于复杂路径来说,这可能是一个昂贵的操作,所以如果可能的话,你会想要缓存结果。
#define RKRandom(x) (arc4random() % ((NSUInteger)(x) + 1))
@implementation StrokeView
- (void)drawRect:(NSRect)rect
{
NSRect bounds = self.bounds;
//first draw using Core Graphics calls
CGContextRef c = [[NSGraphicsContext currentContext] graphicsPort];
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, NSMidX(bounds), NSMidY(bounds));
CGContextSetMiterLimit(c,90.0);
CGContextSetLineJoin(c, kCGLineJoinRound);
CGContextSetLineCap(c, kCGLineCapRound);
for(NSUInteger f = 0; f < 20; f++)
{
CGPathAddCurveToPoint(
path,
NULL,
(CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds),
(CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds),
(CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds),
(CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds),
(CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds),
(CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds)
);
}
for(NSInteger i = 0; i < 8; i+=2)
{
CGContextSetLineWidth(c, 8.0 - (CGFloat)i);
CGFloat tint = (CGFloat)i * 0.15;
CGContextSetRGBStrokeColor (
c,
1.0,
tint,
tint,
1.0
);
CGContextAddPath(c, path);
CGContextStrokePath(c);
}
CGPathRelease(path);
//now draw using Cocoa drawing
NSBezierPath* cocoaPath = [NSBezierPath bezierPathWithRoundedRect:NSInsetRect(self.bounds, 20.0, 20.0) xRadius:10.0 yRadius:10.0];
for(NSInteger i = 0; i < 8; i+=2)
{
[cocoaPath setLineWidth:8.0 - (CGFloat)i];
CGFloat tint = (CGFloat)i * 0.15;
NSColor* color = [NSColor colorWithCalibratedRed:tint green:tint blue:1.0 alpha:1.0];
[color set];
[cocoaPath stroke];
}
}
@end
链接地址: http://www.djcxy.com/p/71067.html
上一篇: Core Graphics: Drawing along a path with a normal gradient
下一篇: How to rotate gradient along with sides of 3D cube in Flash