使用CoreAnimation为动画设置动画

时间:2009-11-19 23:42:14

标签: iphone cocoa-touch core-animation core-graphics

我接近核心动画并凭经验画画。 我试图动画一个简单的形状;所讨论的形状由3条线加上贝塞尔曲线组成。还绘制了一条红线,以显示曲线控制点。

alt text http://img.skitch.com/20091119-1ufar435jdq7nwh8pid5cb6kmm.jpg

我的主控制器只需添加此子视图,并在adjustWave时调用touchesEnd方法。 这是我的形状绘图类的代码。如您所见,该类有一个属性cp1x(贝塞尔控制点1的x)。这是我想要动画的价值。记住,这是一个愚蠢的尝试......

- (void)drawRect:(CGRect)rect {
    float cp1y = 230.0f;
    float cp2x = 100.0f;
    float cp2y = 120.0f;

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextClearRect(ctx, rect);

    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, 10.0f, 200.0f); 
    CGPathAddCurveToPoint (path, NULL, cp1x, cp1y, cp2x, cp2y, 300.0f, 200.0f);
    CGPathAddLineToPoint(path, NULL, 300.0f, 300.0f); 
    CGPathAddLineToPoint(path, NULL, 10.0f, 300.0f); 
    CGPathCloseSubpath(path); 
    CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor); 
    CGContextAddPath(ctx, path); 
    CGContextFillPath(ctx);

    // Drawing a line from control points 1 and 2
    CGContextBeginPath(ctx);
    CGContextSetRGBStrokeColor(ctx,1,0,0,1);
    CGMutablePathRef cp1 = CGPathCreateMutable(); 
    CGPathMoveToPoint(cp1, NULL, cp1x, cp1y); 
    CGPathAddLineToPoint(cp1, NULL, cp2x, cp2y); 
    CGPathCloseSubpath(cp1); 
    CGContextAddPath(ctx, cp1); 
    CGContextStrokePath(ctx);
}

- (void)adjustWave {
    [UIView beginAnimations:@"movement" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationWillStartSelector:@selector(didStart:context:)]; 
    [UIView setAnimationDidStopSelector:@selector(didStop:finished:context:)]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDuration:3.0f]; 
    [UIView setAnimationRepeatCount:3]; 
    [UIView setAnimationRepeatAutoreverses:YES]; 
    cp1x = cp1x + 20.0f;
    [UIView commitAnimations];
}

形状不会改变。相反,如果我取出CA代码并在最后一个方法中添加一个简单的`[self setNeedsDisplay],那么形状会发生变化,但很明显没有CA. 你能帮助涂抹吗?我相信我在这里犯了一个非常基本的错误...... 提前致谢, 的Davide

2 个答案:

答案 0 :(得分:18)

如果你是为iPhone OS 3.x(或Snow Leopard)编写的,那么新的CAShapeLayer class应该可以让你轻松地完成这种动画。如果您的路径保持相同数量的控制点(如您的情况),则可以将该路径设置为CAShapeLayer,然后将path属性从该起始值设置为最终路径。核心动画将对路径中的控制点执行适当的插值,以在这两种状态之间设置动画(如果使用CAKeyframeAnimation,则更多)。

请注意,这是一个图层,因此您需要将其添加为UIView的子图层。另外,我不认为path属性隐式动画,因此您可能需要手动创建CABasicAnimation来设置从路径1到路径2的形状变化的动画。

编辑(2009年11月21日):Joe Ricioppo有一篇关于CAShapeLayer here的精彩文章,包括一些展示这类动画的视频。

答案 1 :(得分:-1)

您将无法使用CA为您的形状设置动画。您只能为CA中的图层属性设置动画,而不能自定义属性。

CA可以很快,因为它不必回调你的代码来执行动画,如果你考虑它是如何实现的,它基本上只是一个用CALayer框架和内容运行GL原语操作的线程。

CA动画是CA在其后台线程上运行的指令集,触发并忘记(在动画完成时加回调),而不是对代码的回调。

设置图层内容的动画将需要CA回调您在每一帧绘制,或者让您指示CA如何绘制。这些都不会发生。