毫无疑问,这可能是一个重复的问题,但我无法从此处的任何帖子中获得适当的解决方案。所以我发布这篇文章作为新帖子,希望我得到一些解决方案。
我的绘图应用程序我想给出一个不透明度的特征来绘制线条。 但是当我将alpha分配给颜色时,我会在线之间得到重叠点。
有些地方我发现用两个视图绘制可以解决这个问题,但我无法理解背后的逻辑。
我使用普通的石英2d代码在触摸事件上绘制线条。
答案 0 :(得分:3)
诀窍是在自己的缓冲区中使用画笔描边,在将整个事物与背景混合之前,可以正确剪辑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();
}