Как анимировать цвет заливки пути, нарисованного с помощью CGContextDrawPath и т. Д. В drawRect :? - PullRequest
1 голос
/ 09 ноября 2010

Интересно, возможно ли анимировать цвет заливки пути, который я нарисовал, используя CoreGraphics?Я рисую это: Простое рисование с помощью 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 ]

7 голосов
/ 09 ноября 2010

Отредактированный ответ:
Вы не можете анимировать материал в -drawRect:.Если вы пытаетесь анимировать цвет фигуры, вы можете посмотреть на CAShapeLayer.Он позволяет вам указать CGPathRef, который он должен рисовать, а также цвета обводки / заливки, и все эти свойства являются анимируемыми.Однако следует иметь в виду, что это не очень эффективно на своей работе.Если ваша фигура не все время анимируется, вы можете установить shouldRasterize на YES.Это значительно ускорит рендеринг до тех пор, пока слой не будет анимирован.Если вы сделаете это, будьте осторожны, так как есть ошибки, связанные с 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 голосов
/ 09 ноября 2010

Вы можете посмотреть на CALayer и Core Animation.Вы можете сделать что-то вроде этого (не проверено):

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

CALayer backgroundColor"animatable".Это может потребовать некоторых изменений в вашем методе drawRect: - например, выполнить заливку с помощью [UIColor clearColor] и / или установить непрозрачное свойство представления в NO и т. Д.

Просто идея - но это должно быть выполнимо.

Мне пришлось сделать что-то похожее, но немного более сложное.Для этого я использовал второй поток и своего рода шаблон «производитель / потребитель».Я думаю, что это излишне для ваших нужд, но это еще один вариант.

0 голосов
/ 09 ноября 2010

Не думаю, что ты можешь.Кварц предназначен для рисования статичных вещей, таких как кнопки, он не хорош для рисования в реальном времени.

...