5

如何在翻译过程中使用一组图像(即在 img1 和 img2 之间切换)更改 myLayer.contents?谢谢!

UIImage *myImage = [UIImage imageNamed:@"img1.png"];
CALayer *myLayer = [CALayer layer];
myLayer.contents = (id)myImage.CGImage;
myLayer.Position = CGPointMake(0,0);
myLayer.Bounds=CGRectMake(0.0, 0.0, 50, 50);
[self.view.layer addSublayer:myLayer];

//translation1
CGPoint startPt = CGPointMake(10,10);
CGPoint endPt = CGPointMake(100,100);    
CABasicAnimation *transl1 = [CABasicAnimation animationWithKeyPath:@"position"];
transl1.removedOnCompletion = FALSE;
transl1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
transl1.fromValue = [NSValue valueWithCGPoint:startPt];
transl1.toValue = [NSValue valueWithCGPoint:endPt];
transl1.duration = 3;
transl1.fillMode = kCAFillModeForwards;
transl1.beginTime = 0;
[myLayer addAnimation: transl1 forKey:  nil];
4

3 回答 3

2

行走的人示例:

我处理了完全相同的任务,但我必须做一个运行蜘蛛,它是 6 腿步行,有 12 帧。这实际上很难做到,我花了几个月的时间来完善。问题是,醒着的人示例通常是通过将一组图像帧(第一条腿,最后一条腿)设置为 UIImageView 的动画图像属性来完成的。然后你打开和关闭动画以及左右移动的角色,从而产生行走的错觉。现在,当您想要创建加速错觉时,就会出现大问题。在动画播放期间无法更改动画持续时间,这是一个很难克服的重大挫折。

这是我为解决此问题而生成的代码:

在这里,您定义了一个包含步行腿框架的数组,每步框架。

animationImagesSpider = [NSArray arrayWithObjects:
[UIImage imageNamed:@"1@2x.png"], [UIImage imageNamed:@"2@2x.png"], [UIImage imageNamed:@"3@2x.png"], [UIImage imageNamed:@"4@2x.png"], [UIImage imageNamed:@"5@2x.png"], [UIImage imageNamed:@"6@2x.png"], [UIImage imageNamed:@"6@2x.png"], [UIImage imageNamed:@"8@2x.png"], [UIImage imageNamed:@"9@2x.png"], [UIImage imageNamed:@"10@2x.png"], [UIImage imageNamed:@"11@2x.png"], [UIImage imageNamed:@"1@2x.png"], nil];   

在这里,您将数组附加到 UIImageView:

imgViewSpider = [[UIImageView alloc] initWithFrame:CGRectMake(200,410,100,145)];
imgViewSpider.animationImages = animationImagesSpider;

现在如果你简单地调用 [imgViewSpider startAnimating]; 这将以恒定速度启动动画,直到您停止它。为了克服这个问题,我使用了一个递归,它为每个步骤播放一个简短的动画,这允许调整每个步骤之间的持续时间:

- (void) spiderRun {

    imgViewSpider.animationDuration= 0.51-(accSp/3.5);
    [imgViewSpider setAnimationRepeatCount:222]; /// this is a dummy value that has no effect because animtion ends after the first frame
    [imgViewSpider startAnimating];
    [self performSelector:@selector(spiderRun) withObject:nil afterDelay: 0.5-(accSp/3.5)];

}

通过不断改变 accSp 的值,我可以控制行走过程中的行走速度。

于 2012-05-13T14:35:07.387 回答
1

正如另一张海报所说,创建第二个动画,将图层的内容属性设置为新图像。

我建议将两个动画放入一个动画组中,并将动画组添加到图层中。然后,您可以轻松控制两个动画的持续时间和开始时间。您可以在总持续时间的一部分内进行图像交换,定时在动画中间进行。

您将使用 beginTime 属性设置动画的开始,并使用 duration 属性设置持续时间。

于 2012-05-13T12:01:45.320 回答
0

您将需要创建第二个动画 transl2,此动画将使图像交换。您需要将持续时间设置为 transl1 持续时间的一半,以便它位于 transl1 动画的中间。

transl1.duration = 3

transl2.duration = 1.5

于 2012-05-13T10:47:52.887 回答