我正在尝试沿包含一些贝塞尔曲线的 CGPathRef
制作图形动画,我希望动画从开始到结束具有平滑、恒定的速度。不过,我遇到的是每次到达关键点时动画都会缓入缓出。我试过使用不同的 timingFunction
和 calculationMode
设置,但我似乎无法找到正确的组合来完成工作。
这是我到目前为止所得到的:
-(void)animate
{
CAKeyframeAnimation *posAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
posAnim.path = [self pathForAnimation];
posAnim.duration = 12.0;
posAnim.calculationMode = kCAAnimationPaced;
posAnim.fillMode = kCAFillModeBoth;
posAnim.removedOnCompletion = NO;
posAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[image.layer addAnimation:posAnim forKey:@"posAnim"];
}
-(CGPathRef)pathForAnimation
{
CGMutablePathRef path;
CGPoint point;
CGPoint controlPoint1;
CGPoint controlPoint2;
path = CGPathCreateMutable();
point = CGPointMake(209.5f, 24.5f);
CGPathMoveToPoint(path, NULL, point.x, point.y);
point = CGPointMake(249.5f, 64.5f);
controlPoint1 = CGPointMake(232.5f, 25.5f);
controlPoint2 = CGPointMake(249.5f, 37.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
point = CGPointMake(146.5f, 301.5f);
controlPoint1 = CGPointMake(249.5f, 91.5f);
controlPoint2 = CGPointMake(147.5f, 258.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
point = CGPointMake(146.5f, 458.5f);
controlPoint1 = CGPointMake(145.5f, 344.5f);
controlPoint2 = CGPointMake(170.5f, 418.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
point = CGPointMake(18.5f, 530.5f);
controlPoint1 = CGPointMake(122.5f, 498.5f);
controlPoint2 = CGPointMake(18.5f, 530.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
return path;
}
为了它的值(value),我尝试用直线替换曲线(使用 CGPathAddLineToPoint
),这给了我想要的恒定速度。但当然,如果可能的话,我宁愿有曲线。
我也曾尝试用 timingFunctions
数组替换 timingFunction
,但无济于事。
最佳答案
您是否尝试过将关键帧动画的 calculationMode 属性设置为 kCAAnimationCubicPaced?该属性专门用于使动画在整个曲线上遵循恒定的速度。
关于objective-c - 具有贝塞尔曲线和恒定速度的 CAKeyframeAnimation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139130/