2010-11-08 16 views
1

Je me demande s'il est possible d'animer la couleur de remplissage d'un chemin que j'ai dessiné en utilisant CoreGraphics? Je dessine ceci: Simple drawing with Quartz - Core GraphicsComment animer la couleur de remplissage du chemin tracé avec CGContextDrawPath, etc dans drawRect :?

et je veux changer sa couleur de remplissage du blanc pour dire le gris. Est-ce possible?

Je connais l'existence de la propriété view.layer.content mais est-ce utile ici? Cependant, je ne suis pas sûr comment je peux l'utiliser dans ce cas.

Merci d'avance.

Mise à jour

J'essaie cette approche (sa poussette, donc je peux dire si son aller travailler) essentiellement Je crée un CGImageRef et le transmettre à self.layer.contents qui est animable en utilisant des animations UIView mais .... Je reçois des résultats étranges, en plus de ne pas animer.

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); 

La logique est-elle OK ?, et où se trouve l'erreur ici? ; (

Répondre

7

Edité réponse:
Vous ne pouvez pas animer des choses dans -drawRect: Si vous essayez d'animer la couleur d'une forme, vous voudrez peut-être regarder CAShapeLayer Il vous permet de spécifier un CGPathRef.. qu'il faut dessiner, ainsi que les couleurs de coup/remplissage, et toutes ces propriétés sont animables.Un chose à garder à l'esprit, cependant, c'est que ce n'est pas très efficace dans son travail.Si votre forme n'anime pas tout le temps , vous voudrez peut-être régler shouldRasterize à YES, ce qui accélèrera considérablement le rendu tant que la couche ne s'anime pas, faites attention car il y a des bogues relatifs à shouldRasterize. le opacity à 0, et plus tard le rendre non-0, shouldRasterize a tendance à ne rien dessiner du tout car il met en cache le dessin à l'opacité 0.

réponse originale:
Si vous vivez dans CoreGraphics entièrement, vous pouvez utiliser CGContextSetFillColorWithColor(), lui donnant le contexte et un CGColorRef (par exemple CGContextSetFillColorWithColor(ctx, [UIColor grayColor].CGColor) Si vous essayez de régler la couleur de remplissage du « courant. "contexte graphique, vous pouvez aussi utiliser le peu plus simple [[UIColor grayColor] setFill]

Modifier. Après avoir regardé votre lien, il vous suffit de changer la ligne qui dit

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

pour utiliser la couleur de votre choix. Dans ce cas, ce serait

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

Et comment cela animerait-il? – Eiko

+0

Oh, je suis désolé, soit j'ai mal lu votre question ou il a été édité après. Je n'avais pas réalisé que tu essayais d'animer. Je vais modifier ma réponse pour inclure une version animable. –

0

Je ne pense pas que vous le pouvez. Le quartz est destiné à dessiner des choses statiques comme des boutons, ce n'est pas bon pour le dessin en temps réel.

+0

Oui, c'est pourquoi j'essaie de définir layer.contents qui est animable;) – nacho4d

0

Vous pouvez regarder CALayer et Core Animation. Vous pourriez être en mesure de faire quelque chose comme ça (non testé):

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

CALayer's backgroundColor est « animable ».Cela peut nécessiter quelques modifications de votre drawRect: méthode - comme faire un remplissage avec [UIColor clearColor] et/ou définir la propriété opaque de la vue sur NO, etc.

Juste une idée - mais cela devrait être faisable.

Je devais faire quelque chose de similaire mais un peu plus impliqué. Pour cela, j'ai fini par utiliser un deuxième fil et une sorte de modèle producteur/consommateur. Je pense que cela serait trop pour vos besoins, mais c'est une autre option.

+0

Ce n'est pas mon cas, puisque mon background est clearColor. Je dessine des CGPaths et je veux que la couleur de remplissage de ces CGPath soit animée et non la couleur d'arrière-plan de la couche – nacho4d

+0

Eh bien, je suppose que vous pourriez ajouter une sorte de NSTimer qui définirait une couleur de remplissage sur votre UIView et forcerait un redessin . Ensuite, votre appel de remplissage utiliserait ce fichier ... – westsider

+0

Je voulais dire que la couleur de remplissage ivar pouvait être changée par étapes, de manière à produire un effet animé. – westsider