1

我有一个CGPathRef形状奇特的多边形。我需要将 alpha 应用到此路径之外的区域。这很简单。

CGContextAddPath(context, crazyPolygon);
CGContextSetFillColor(context, someAlphaColor);
CGContextEOFillPath(context);

我需要用圆圈做类似的事情,也很简单。

CGMutablePathRef circlePath = CGPathCreateMutable();
CGPathAddRect(circlePath, NULL, rect);
CGPathAddEllipseInRect(circlePath, NULL, circleBox);
CGContextAddPath(context, circlePath);
CGContextSetFillColor(context, someAlphaColor);
CGContextEOFillPath(context);

当我尝试使这两个形状相交时,问题就出现了。我想将 alpha 应用于不在两个形状内的任何像素。

  • 如果该点在圆内但不在多边形内,则应用 alpha。
  • 如果它在多边形中但不在圆形中,则应用 alpha。
  • 如果它同时在多边形和圆形中,则像素应该是完全透明的。

我尝试了很多不同的方法。没有一个工作。最有希望的是用多边形创建一个蒙版,并用CGContextClipToMask它来限制圆的绘制。整个圆圈是在没有剪裁的情况下绘制的。

4

1 回答 1

0

经过几个小时的反复试验,我终于弄明白了。

// Set up
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat outOfAreaColor[4] = { 0.0, 0.0, 0.0, OUT_OF_AREA_ALPHA };
CGContextSetFillColor(context, outOfAreaColor);

// Path for specifying outside of polygons
CGMutablePathRef outline = CGPathCreateMutable();
CGPathAddRect(outline, NULL, rect);
CGPathAddPath(outline, NULL, path);

// Fill the area outside of the path with an alpha mask
CGContextAddPath(context, outline);
CGPathRelease(outline);
CGContextEOFillPath(context);

// Add the inside path to the context and clip the context to that area
CGContextAddPath(context, insidePolygon);
CGContextClip(context);

// Create a path defining the area to draw outside of the circle
// but within the polygon
CGRect circleBox = CGRectMake(0, 0, circleRadius * 2.0, circleRadius * 2.0);
CGMutablePathRef darkLayer = CGPathCreateMutable();
CGPathAddRect(darkLayer, NULL, rect);
CGPathAddEllipseInRect(darkLayer, NULL, circleBox);
CGContextAddPath(context, darkLayer);
CGContextEOFillPath(context);
CGPathRelease(darkLayer);

使用 时CGPathAddEllipseInRect,圆/椭圆的中心是circleBox.origin.x + circleBox.size.width / 2.0, circleBox.origin.y + circleBox.size.height / 2.0,而不是0.0, 0.0。文档非常清楚地说明了这一点,但是在定位形状时必须弄清楚这一点很烦人。

于 2011-08-11T16:26:53.940 回答