【问题标题】:How to have a view travel the path of an inverted parabola?如何让视图沿着倒抛物线的路径行进?
【发布时间】:2013-08-18 15:09:56
【问题描述】:

我有一条倒抛物线,我需要有一个视图穿过抛物线的路径。视图应该沿着抛物线的路径稍微旋转和平移。

我做了一些研究,发现 BezierPath(带控制点的四曲线)可以用来铺设抛物线的路径,然后我们可以使用 CAKeyFramAnimation 沿着路径移动对象。沿着路径动画视图对象抛物线让我感到困惑。 我如何不断改变抛物线内对象的起点并保持视图的最新状态

以下是我想通过抛物线视图实现的简要说明

视图从抛物线中的特定点开始,然后遍历抛物线直到指定的终点。 如何找出抛物线内的终点? 一旦视图到达终点。对于下一次遍历,它可以从该点开始,然后移动到抛物线内的任何其他点。这将基于下一个终点连续发生。

这是一个粗略的草图哦,路径和视图的样子

而且我还希望通过路径的视图的旋转和平移同时发生

如何做到这一点?

谢谢!

【问题讨论】:

  • 您已经知道CAKeyFramAnimation,请尝试一下。数学是关于你如何知道路径上特定点的另一部分的答案。
  • @Wain 我可以在 CAKeyFrameAnimation 中指定视图的起点和终点吗?

标签: iphone ios objective-c core-graphics core-animation


【解决方案1】:
  • 使用 UIBezierPath 绘制抛物线并将其转换为 CGPath 或创建 CGPath。
  • 使用 CAKeyFrameAnimation 移动 UIView 的位置。

看下面的源码,

画抛物线

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path,NULL,50.0,120.0);

CGPathAddCurveToPoint(path,NULL,50.0,275.0,
                      150.0,275.0,
                      150.0,120.0);
CGPathAddCurveToPoint(path,NULL,150.0,275.0,
                      250.0,275.0,
                      250.0,120.0);    
CGPathAddCurveToPoint(path,NULL,250.0,275.0,
                      350.0,275.0,
                      350.0,120.0);    
CGPathAddCurveToPoint(path,NULL,350.0,275.0,
                      450.0,275.0,
                      450.0,120.0);

CAKeyFrameAnimation 沿路径。

CAKeyframeAnimation* AniLoc = [CAKeyframeAnimation animationWithKeyPath:@"position"]; // notice key change

// rest is the same
AniLoc.path = thePath;
AniLoc.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
AniLoc.keyTimes= [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                  [NSNumber numberWithFloat:0.3f],
                  [NSNumber numberWithFloat:1.0f],nil];
AniLoc.duration = 2.0;

CFRelease(thePath);

[self.logo.layer addAnimation:AniLoc forKey:nil];

【讨论】:

  • 我希望仅在抛物线上的某些点之间移动视图。我正在寻找一种方法来指定起点和终点,以便我可以仅在这些点之间设置平移path.. 有没有办法使用 CAKeyFrameAnimation 来实现这一点?
  • 您想绘制抛物线,但在抛物线内从起点移动到终点。不是吗。。如果您知道从哪里开始和结束,您可以使用点本身构建您的 CGPath。
  • 所以它就像在抛物线路径内创建一个小子路径对吗?但是在抛物线路径内动态创建这样的子路径只是为了移动到终点不会很复杂,因为必须决定一个控件指出我正在使用贝塞尔路径来创建弧线。难道没有更简单的方法吗?我认为 CAKeyFrameAnimation 会有某种设施,可以让我指定我想要在抛物线路径内的两点之间准确移动视图的位置
  • 还有一件事我不会使用 CGPath 来构造路径,原因有两个 i)我不希望路径可见 ii)我没有在子类视图的 drawRect 内做这些事情。由于不需要看到路径,我求助于使用 BezierPath.. 如果我错了,请纠正我!
  • @Mr.Anonymous:CGPath 不需要您绘制它。这只是贝塞尔路径的 CG 实现。您可以使用该路径来描述运动而不是轮廓,就像 Vignesh 的代码所做的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2013-04-20
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
相关资源
最近更新 更多