如何用alpha<绘制线条? 1英寸石英2d

时间:2012-02-23 05:12:49

标签: iphone ios ios4 quartz-graphics

毫无疑问,这可能是一个重复的问题,但我无法从此处的任何帖子中获得适当的解决方案。所以我发布这篇文章作为新帖子,希望我得到一些解决方案。

我的绘图应用程序我想给出一个不透明度的特征来绘制线条。 但是当我将alpha分配给颜色时,我会在线之间得到重叠点。

有些地方我发现用两个视图绘制可以解决这个问题,但我无法理解背后的逻辑。

enter image description here

我使用普通的石英2d代码在触摸事件上绘制线条。

4 个答案:

答案 0 :(得分:3)

重复In CoreGraphics drawing how can I keep the point of overlap from being darker than the rest of the line?

诀窍是在自己的缓冲区中使用画笔描边,在将整个事物与背景混合之前,可以正确剪辑alpha。

以下是一种方法:创建2个视图,一个用于背景,另一个用于行。在顶视图中绘制alpha为1的行!然后将整个前景视图的alpha设置为0.5(或您想要使用的任何值)。

[topView setAlpha:0.5];

这将防止半透明画笔笔划自我强化。但是,两个不同的画笔笔划相互交叉(如您的示例)。你想要那个交叉点更强烈吗?如果是这样,那么您需要为每个画笔笔划创建一个新视图。为防止内存溢出导致视图过多,您需要将前一个顶视图与背景混合。

答案 1 :(得分:1)

Hie ..

这是我的最终解决方案.. 我现在在drawRect事件上绘制线条并一次绘制整条线作为路径.. 这会创建不透明度,现在不会在其间绘制线条。

毫无疑问,这是一个有效的技巧,因为我正在吸取每一次触摸,这有效..

- (void)drawRect:(CGRect)rect {
for (int j=0; j<[pathArray count]; j++) 
{
    context = UIGraphicsGetCurrentContext();
    NSMutableDictionary *tmp=[pathArray objectAtIndex:j];
    NSMutableArray *currentPath=[tmp objectForKey:@"path"];
    for (int i=0; i<[currentPath count]; i++) 
    {
        CGPoint mid1 = [[self midPoint:[currentPath objectAtIndex:i+1]  :[currentPath objectAtIndex:i]] CGPointValue]; 
        CGPoint mid2 = [[self midPoint:[currentPath objectAtIndex:i+2] :[currentPath objectAtIndex:i+1]] CGPointValue];
        CGContextMoveToPoint(context, mid1.x, mid1.y);
        CGContextAddQuadCurveToPoint(context, [[currentPath objectAtIndex:i+1] CGPointValue].x, [[currentPath objectAtIndex:i+1] CGPointValue].y, mid2.x, mid2.y); 
        CGContextSetShadow(context, CGSizeMake(-2, -2), 3);
        CGContextSetAlpha(context, [[tmp objectForKey: @"opacity"] floatValue]);    
        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetStrokeColorWithColor(context,[[tmp objectForKey: @"Color"] CGColor]);               
        CGContextSetLineWidth(context, [[tmp objectForKey: @"width"] floatValue]);              
        i+=2;
    }   
    CGContextStrokePath(context);

}
}

答案 2 :(得分:0)

看起来你在一系列触摸事件的每个点都画了一个圆圈。相反,您可以使用CoreGraphics/Quartz2D构建Path,将线宽设置为任何厚度,然后根据需要描绘该路径以保持UI看起来不错。我暂时没有这样做,但我认为您需要的大部分内容都在CoreGraphics/CGContext.h~/CGPath.h, etc.中。请参阅我对另一个CoreGraphics问题的回答here

现在我不知道的是你是否可以在关闭之前将CGMutablePathRef描述为一个上下文。它使用CGPathCloseSubpath()。你必须要做实验。无论如何,当您收到鼠标事件时,您将使用新点构建一个路径并一次渲染一点。如果您需要澄清,请告诉我。

P.S。对于opacity,您在为上下文创建CGColorRef设置 ... CoreGraphics/CGColor.h中的许多调用都有alpha参数。< / p>

答案 3 :(得分:-1)

#pragma mark -
#pragma mark Touch Event

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];

    lastPoint = [touch locationInView:drawView];
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:drawView];

    UIGraphicsBeginImageContext(drawView.frame.size);

    [drawImage.image drawInRect:CGRectMake(0, 0, drawView.frame.size.width, drawView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    lastPoint = currentPoint;

}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UIGraphicsBeginImageContext(drawView.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, drawView.frame.size.width, drawView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    CGContextFlush(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}