2010-11-08 104 views
1

我想知道是否可以使用CoreGraphics繪製的路徑的填充顏色動畫? 我正在繪製: Simple drawing with Quartz - Core Graphics如何在drawRect中爲使用CGContextDrawPath等繪製的路徑填充顏色?

我想將其填充顏色從白色改爲灰色。 這可能嗎?

我知道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); 

是邏輯好嗎?,這裏的錯誤在哪裏? (

回答

7

編輯答案:
不能在-drawRect:動畫的東西,如果你想動畫的形狀的顏色,你可能想看看CAShapeLayer它允許你指定一個CGPathRef。它應該畫,以及中風/填充顏色,所有這些屬性都是可以動畫的。但是要記住的一點是,這在工作中效率不高。如果你的形狀始終不是動畫,你可能想要設置shouldRasterizeYES,只要圖層沒有動畫效果,這會顯着提高渲染速度,如果你這樣做,請小心,因爲有shouldRasterize的錯誤。 opacity爲0,並且稍後將其設爲非0,shouldRasterize傾向於不繪製任何東西,因爲它在0不透明度處緩存繪圖。

原來的答覆
如果你生活在CoreGraphics中完全,你可以使用CGContextSetFillColorWithColor(),給它的背景和一個CGColorRef(如CGContextSetFillColorWithColor(ctx, [UIColor grayColor].CGColor)如果你想調整的「當前填充顏色。 「圖形上下文,你也可以只使用稍微簡單[[UIColor grayColor] setFill]

編輯:看你的鏈接後,你只需要改變,說

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

使用任何你想要的顏色。在這種情況下,它將是

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

那該怎麼做動畫? – Eiko 2010-11-08 23:47:53

+0

哦,對不起,要麼我誤讀了你的問題,要麼以後編輯過。我沒有意識到你正在嘗試製作動畫。我會編輯我的答案以包含一個動畫版本。 – 2010-11-09 02:31:51

0

我不認爲你可以。石英是爲了繪製像按鈕這樣的靜態事物,它不擅長實時繪圖。

+0

是的,這就是爲什麼我要設置layer.contents這是動畫;) – nacho4d 2010-11-09 00:44:46

0

你可能會看CALayer和核心動畫。你也許可以做到像這樣(未經):

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

CALayer's backgroundColor爲「動畫」。這可能需要對drawRect:方法進行一些修改 - 就像使用[UIColor clearColor]進行填充和/或將視圖的不透明屬性設置爲NO等。

只是一個想法 - 但它應該是可行的。

我不得不做類似的事情,但更多的參與。爲此,我最終使用了第二個線程和一種生產者/消費者模式。我認爲這會損害您的需求,但這是另一種選擇。

+0

這不是我的情況,因爲我的背景是clearColor。我正在繪製一些CGPaths,我希望這些CGPath的填充顏色是動畫而不是圖層的背景顏色本身 – nacho4d 2010-11-09 00:47:07

+0

那麼我想你可以添加某種NSTimer,它會在你的UIView上設置一些'填充顏色'ivar並強制重繪。然後你的填充矩形電話會使用那個伊娃... – westsider 2010-11-09 00:50:21

+0

我的意思是說,填充色伊娃可以在步驟中改變,以產生動畫效果。 – westsider 2010-11-09 05:23:24