我接近核心动画并凭经验画画。 我试图动画一个简单的形状;所讨论的形状由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
答案 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如何绘制。这些都不会发生。