如何在drawRect中使用CGContextDrawPath等绘制的路径的填充颜色设置动画:?

时间:2010-11-08 23:32:02

标签: iphone core-animation core-graphics

我想知道是否可以使用CoreGraphics为我绘制的路径填充颜色设置动画效果? 我画这个: Simple drawing with Quartz - Core Graphics

我想从白色改变它的填充颜色,让我们说灰色。 这可能吗?

我知道view.layer.content属性的存在,但这在这里有用吗?虽然,我不确定在这种情况下如何使用它。

提前致谢。

更新

我正在尝试这种方法(它的马车,因此我可以判断它是否会起作用) 基本上我正在创建一个CGImageRef并将其传递给self.layer.contents,它是可动画的 使用UIView动画,但....我得到了奇怪的结果,除了没有动画。

int bitsPerComponent = 8;
int channels = 4;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
void *data = malloc(self.bounds.size.width*self.bounds.size.height*channels);

CGContextRef context = CGBitmapContextCreate(data,                      //pointer to data
                                             self.bounds.size.width,    //width
                                             self.bounds.size.height,   //height
                                             bitsPerComponent,          //bitsPerComponent
                                             self.bounds.size.width*channels,//bytesPerRow
                                             colorSpace,                    //colorSpace
                                             kCGImageAlphaPremultipliedFirst);  //bitmapInfo

//method that uses below link's code
[self _drawBackgroundInContext:context color:UIColorFromMandalaBoxType(type)];

CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL,         //info, NULL
                                                              data,         //pointer to data
                                                              self.bounds.size.width*self.bounds.size.height*channels, //number of bytes
                                                              NULL);        //release callback


CGImageRef image = CGImageCreate(self.bounds.size.width,            //width
                                 self.bounds.size.height,         //height
                                 bitsPerComponent,                //bitsPerComponent
                                 bitsPerComponent*channels,       //bitsPerPixel
                                 self.bounds.size.width*channels, //bytesPerRow
                                 colorSpace,                        //colorSpace
                                 kCGImageAlphaPremultipliedFirst,   //bitmapInfo
                                 dataProvider, NULL, false, kCGRenderingIntentDefault);

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.5f];
self.layer.contents = (id)image;
[UIView commitAnimations];

CGImageRelease(image);
CGDataProviderRelease(dataProvider);
CGContextRelease(context);
free(data);
CGColorSpaceRelease(colorSpace);

逻辑好吗?这里的错误在哪里? ;(

3 个答案:

答案 0 :(得分:7)

编辑回答:
你不能在-drawRect:中制作动画。如果您尝试为形状的颜色设置动画,则可能需要查看CAShapeLayer。它允许您指定它应绘制的CGPathRef,以及笔触/填充颜色,并且所有这些属性都是可动画的。但要记住的一点是,这在其工作中并不是非常有效。如果您的形状不是始终制作动画,则可能需要将shouldRasterize设置为YES。只要图层不是动画,这将显着加快渲染速度。如果您这样做,请小心,因为存在与shouldRasterize相关的错误。我想到的是,如果将opacity设置为0,然后将其设置为非0,则shouldRasterize倾向于不绘制任何内容,因为它以0不透明度缓存了绘图。 / p>

原始回答
如果你完全生活在CoreGraphics中,你可以使用CGContextSetFillColorWithColor(),给它上下文和CGColorRef(例如CGContextSetFillColorWithColor(ctx, [UIColor grayColor].CGColor)。如果你试图调整“当前”图形上下文的填充颜色,您也可以使用稍微简单的[[UIColor grayColor] setFill]

编辑:查看链接后,您只需更改显示

的行
CGContextSetFillColorWithColor(context, [UIColor white].CGColor);

使用你想要的任何颜色。在这种情况下,它将是

CGContextSetFillColorWithColor(context, [UIColor grayColor].CGColor);

答案 1 :(得分:0)

我认为你不能。 Quartz用于绘制像按钮这样的静态内容,它不擅长实时绘图。

答案 2 :(得分:0)

您可以查看CALayer和Core Animation。你可以做这样的事情(未经测试):

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: 0.8];
self.view.layer.backgroundColor = [UIColor grayColor];
[UIView commitAnimations];

CALayer's backgroundColor是“动画”。这可能需要对drawRect:方法进行一些更改 - 比如使用[UIColor clearColor]填充和/或将视图的opaque属性设置为NO等等。

只是一个想法 - 但它应该是可行的。

我必须做类似的事情,但更多的参与。为此,我最终使用了第二个线程和一种Producer / Consumer模式。我认为这样做会过度满足您的需求,但这是另一种选择。