我正在开发一个带有一些简单动画的 iPhone 应用程序。
我有一个我想翻译的观点,但不是沿着一条线。我想把它翻译成抛物线。想象一下,我正在为一辆沿着弯曲道路行驶的汽车制作动画。
我知道我可以将转换正确设置为 CGAffineTransform 的实例
问题是,我不知道如何创建转换。我知道如何缩放、翻译等,但如何进行抛物线翻译?甚至可能吗?
我正在开发一个带有一些简单动画的 iPhone 应用程序。
我有一个我想翻译的观点,但不是沿着一条线。我想把它翻译成抛物线。想象一下,我正在为一辆沿着弯曲道路行驶的汽车制作动画。
我知道我可以将转换正确设置为 CGAffineTransform 的实例
问题是,我不知道如何创建转换。我知道如何缩放、翻译等,但如何进行抛物线翻译?甚至可能吗?
要沿平滑曲线制作动画,您需要使用 CAKeyframeAnimation。在这个答案中,我提供了组合动画的代码,该动画沿曲线移动图像视图,同时调整它的大小并使其淡出。该代码的相关部分如下:
// Set up path movement
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;
CGPoint endPoint = CGPointMake(480.0f - 30.0f, 40.0f);
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGPathMoveToPoint(curvedPath, NULL, viewOrigin.x, viewOrigin.y);
CGPathAddCurveToPoint(curvedPath, NULL, endPoint.x, viewOrigin.y, endPoint.x, viewOrigin.y, endPoint.x, endPoint.y);
pathAnimation.path = curvedPath;
CGPathRelease(curvedPath);
这将创建一条带有两个控制点的曲线,一个位于视图的原点,另一个位于显示屏的右上角(在横向模式下)。有关构建路径的更多信息,请参阅Quartz 2D Programming Guide或Animation Types and Timing Programming Guide。
要使用此动画,您需要使用以下内容将其添加到视图层:
[imageViewForAnimation.layer addAnimation:pathAnimation forKey:@"curveAnimation"];
沿曲线制作动画的一种美观的方式是使用样条线。这些在数学上简单且计算效率高。求解抛物线拱的最小阶样条是二次样条。
要包括图像沿路径的旋转,只需添加以下内容
pathAnimation.rotationMode = @"auto";
您还可以添加定时功能来创建缓入/缓出效果
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
听起来您需要定期将变换属性设置为CGAffineTransformTranslate
使用沿抛物线选择的 x,y 参数创建的 a(按照 Russell 的建议从 y 中获取 x,反之亦然)。
如果您还希望汽车沿抛物线弯曲时旋转(看起来更逼真),您将需要CGAffineTransormRotate
. 根据当前绘制点的抛物线斜率确定角度。您需要一个 atan() 函数来计算坡度的角度。听起来很痛苦,希望有更简单的方法。
我真的不知道我在说什么,我只是读了这篇博文:Demystifying CGAffineTransform。