代码之家  ›  专栏  ›  技术社区  ›  nacho4d

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

  •  1
  • nacho4d  · 技术社区  · 14 年前

    我想知道是否有可能动画填充颜色的路径,我已绘制使用核心图形? 我在画这个: Simple drawing with Quartz - Core Graphics

    这可能吗?

    我知道VIEW.LAY.内容属性的存在,但在这里有用吗?不过,我不知道在这种情况下如何使用它。

    更新

    我正在尝试这种方法(它的小车,因此我可以判断它是否会工作) 使用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 年前
        1
  •  7
  •   Lily Ballard    14 年前

    编辑答案:
    你不能在中设置动画 -drawRect: . 如果要设置形状颜色的动画,可能需要查看 CAShapeLayer CGPathRef 它应该绘制,以及笔划/填充颜色,并且所有这些属性都是可设置动画的。不过,要记住的一点是,这项工作效率并不高。如果您的形状不是一直在设置动画,则可能需要设置 shouldRasterize YES . 这将显著加快渲染速度,只要该层没有设置动画。如果你这样做了,要小心,因为有与 应该光栅化 . 我突然想到的是如果你把 opacity 到0,然后使其非0, 应该光栅化

    原始答案 :
    CGContextSetFillColorWithColor() ,给出上下文和CGColorRef(例如。 CGContextSetFillColorWithColor(ctx, [UIColor grayColor].CGColor) . 如果要调整“当前”图形上下文的填充颜色,也可以使用稍微简单一点的 [[UIColor grayColor] setFill] .

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

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

    想用什么颜色就用什么颜色。在这种情况下

    CGContextSetFillColorWithColor(context, [UIColor grayColor].CGColor);
    
        2
  •  0
  •   denizen    14 年前

        3
  •  0
  •   westsider    14 年前

    你可以看看卡拉耶和核心动画。您可能可以执行以下操作(未经测试):

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

    CALayer's backgroundColor

    只是个主意-但应该是可行的。

    我不得不做一些类似的事情,但要更投入一些。为此,我使用了第二个线程和一种生产者/消费者模式。我认为这会超出你的需要,但这是另一种选择。