我想知道是否可以使用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);
逻辑好吗?这里的错误在哪里? ;(
答案 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模式。我认为这样做会过度满足您的需求,但这是另一种选择。