【问题标题】:How do I further animate an image that's on a bezier path如何进一步为贝塞尔路径上的图像设置动画
【发布时间】:2012-09-04 04:36:15
【问题描述】:

也许有人可以为我指明正确的方向。我试过谷歌,但真的不知道如何用可搜索的术语来定义我的问题。

我正在像这样沿 UIBezierPath 为图像设置动画:

UIBezierPath *trackPath = [UIBezierPath bezierPath];
[trackPath moveToPoint:P(8, 250)];
[trackPath addCurveToPoint:P(318, 250)
             controlPoint1:P(156, 86)
             controlPoint2:P(166, 412)];
[trackPath addCurveToPoint:P(652, 254)
             controlPoint1:P(488, 86)
             controlPoint2:P(512, 412)];
[trackPath addCurveToPoint:P(992, 254)
             controlPoint1:P(818, 96)
             controlPoint2:P(872, 412)];


CALayer *bee = [CALayer layer];
bee.bounds = CGRectMake(0, 0, 69, 71);
bee.position = P(160, 25);
bee.contents = (id)([UIImage imageNamed:@"bee3.png"].CGImage);
[self.view.layer addSublayer:bee];

我想做的是在图像沿路径移动时为图像本身设置动画。我可以像这样对图像本身进行动画处理:

    NSArray *blueArray = [NSArray array];
    blueArray = [[NSArray alloc] initWithObjects:
                 [UIImage imageNamed:@"blue1.png"],
                 [UIImage imageNamed:@"blue2.png"], nil];

    blueFly.animationImages = blueArray;
    blueFly.animationDuration = 0.20;
    blueFly.animationRepeatCount = -1;
    [blueFly startAnimating];

可以这么说,我怎样才能将两者结合起来?

另外,我知道如何将路径本身绘制到屏幕上,如下所示:

CAShapeLayer *beeline = [CAShapeLayer layer];
beeline.path = trackPath.CGPath;
beeline.strokeColor = [UIColor whiteColor].CGColor;
beeline.fillColor = [UIColor clearColor].CGColor;
beeline.lineWidth = 2.0;
beeline.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:6],   [NSNumber numberWithInt:2], nil];
[self.view.layer addSublayer:beeline];

但是当图像沿着路径动画时,我怎样才能只在图像后面画线呢?

【问题讨论】:

    标签: objective-c ios xcode core-animation bezier


    【解决方案1】:

    您可以使用CAShapeLayer 来显示路径。形状层提供两个属性strokeStartstrokeEnd,其值介于01 之间,并确定可见路径的比例。通过为strokeEnd 设置动画,您可以创建路径在屏幕上“绘制”的印象。请参阅 http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer 以获取动画笔画线的示例。

    为了改变蜜蜂的图像,您可以简单地添加一个动画来改变蜜蜂层的内容。比如要在上面的CAShapeLayer项目中改变笔的图像,我们可以在startAnimation方法中加入如下代码。

    CAKeyframeAnimation *imageAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
    imageAnimation.duration = 1.0;
    imageAnimation.repeatCount = HUGE_VALF;
    imageAnimation.calculationMode = kCAAnimationDiscrete;
    imageAnimation.values = [NSArray arrayWithObjects:
      (id)[UIImage imageNamed:@"noun_project_347_1.png"].CGImage,
      (id)[UIImage imageNamed:@"noun_project_347_2.png"].CGImage,
      nil];
    [self.penLayer addAnimation:imageAnimation forKey:@"contents"];
    

    这只是向显示笔的图层的contents 属性添加一个关键动画。请注意,图像"noun_project_347_1.png" 不是项目的一部分,因此您必须添加图像才能看到效果。我只是水平翻转了项目附带的图像。通过将calculationMode 设置为kCAAnimationDiscrete,动画不会在两张图片之间插入一张一张。

    【讨论】:

    • 谢谢 Jan,我将深入研究这个例子,听起来很完美!我遇到的另一件事是,一旦我完成了所有动画,我该如何关闭它们?我有一个计时器设置为在 7 秒后调用名为 masterReset 的方法,这使动画有时间播放,但我不确定如何消除我创建的图层。
    • 我不确定我是否理解您的要求,但您可以通过调用 removeAllAnimations 从图层中删除所有动画。或者,您可以使用removeAnimationForKey: 删除特定动画。如果您必须处理多个动画的协调,例如暂停一个动画直到另一个动画完成,请查看wangling.me/2011/06/time-warp-in-animation。这对我很有帮助。
    • 再次感谢您的宝贵时间。我已将 CAKeyframAnimation 上的 repeatCount 调整为 0,这会使蜜蜂在到达终点后消失,但我想同时删除 *beeline。我试过 [self.view.layer removeAllAnimations];但这不起作用。我想我真正想要消除/删除的是 CAShapeLayer *beeline。
    • 如果您想将该层用于另一个动画,您可以简单地从其父层中删除CAShapeLayer 或将strokeEnd 设置为0
    • 是的,这就是我正在阅读的内容,但我不知道该怎么做。问题是我想通过另一种方法来做到这一点,即我的“masterReset”方法。但是当我尝试做 [beeline removeFromSuperlayer];从此方法无法识别直线。我需要做什么才能从创建图层的方法外部调用?
    【解决方案2】:

    只要你能得到你想要动画图像对齐的确切路径,你就可以使用 Core Animation 和 CAKeyframeAnimation 来实现。

    参考how-to-animate-one-image-over-the-unusual-curve-path-in-my-ipad-application)链接。

    【讨论】:

    • 感谢 Prince,这实际上是我在发布之前能够找到的参考资料之一,但该示例的哪一部分为图像本身设置了动画?我有两张蜜蜂的照片,一张翅膀向上,一张翅膀向下,我想在两张图像之间切换,因为它沿着路径动画,所以看起来翅膀在拍打
    猜你喜欢
    • 2012-11-16
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2017-05-18
    相关资源
    最近更新 更多