核心图形:使用正常渐变绘制路径

网上有很多关于如何使用渐变绘制 - 填充或描边的资源。

然而,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