如何在iPhone上使用CoreGraphics逐像素地绘制椭圆

时间:2011-03-25 08:28:01

标签: iphone graphics

我想在iPhone上绘制一个椭圆,我希望看到它的绘制过程,就像我们用笔在一张纸上画椭圆一样。我必须逐个像素地绘制它,并且不要使用 CGContextAddEllipseInRect 。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

如果您定位的是iOS 4.2及更高版本,则可以使用strokeEnd的新属性CAShapeLayer

基本上,CAShapeLayer绘制了您提供的路径。在CABasicAnimation属性上使用strokeEnd,可以为从一个点到另一个点的路径绘制设置动画。

CGPoint ellipseOrigin = CGPointMake(50, 50);
CGSize ellipseSize = CGSizeMake(200, 100);

CGRect rect = (CGRect){CGPointZero, ellipseSize};
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, rect);   

CAShapeLayer *ellipseLayer = [CAShapeLayer layer];
ellipseLayer.frame = (CGRect){ellipseOrigin, ellipseSize};
ellipseLayer.path = path;
ellipseLayer.strokeColor = [UIColor blackColor].CGColor;
ellipseLayer.fillColor = nil; // transparent inside

CFRelease(path);

// I tested it in the viewDidLoad method of a view controller
[self.view.layer addSublayer:ellipseLayer];

CABasicAnimation *drawAnim = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
drawAnim.duration = 5.0;
drawAnim.fromValue = [NSNumber numberWithFloat:0.0f];
drawAnim.toValue = [NSNumber numberWithFloat:1.0f];
[ellipseLayer addAnimation:drawAnim forKey:@"strokeEnd"];

由于Ole Begemann博客上的这篇文章Animating the drawing of a CGPath with CAShapeLayer,我最初学会了如何做到这一点。

答案 1 :(得分:0)

我不确定这是否是最佳方式,但我建议使用二次贝塞尔曲线和某种形式的动画在每一帧绘制不同的曲线。您需要使用 NSTimer 等设置动画,然后在每次定时器触发时在绘制“圆圈”的对象上调用setNeedsRedisplay,同时更新当前时间步长动画绘制对象,因此它知道要计算和绘制哪个帧。

在每次重绘时,都需要进行计算以绘制在动画中进一步前进所需的曲线。您可以使用石英方法CGContextAddQuadCurveToPoint()绘制曲线。您将需要两条曲线来完成整个效果(一个将用于动画的前半部分,一个将用于后半部分。)

我希望这提供了一些初步想法。