[IOS]CoreAnimation基础[翻译5部分]

高等动画技巧

有很多种方式配置属性基于或者关键帧动画。需要进行多重动画或者依次进行动画的app可以使用更高级的行为来同步动画时间或者链接动画。你也可以使用其他动画对象类型来创建有意思的过渡效果,过着其他动画效果。


支持图层可视性改变的过渡动画

过渡动画产生图层的视觉过渡效果。最常用的过渡的动画效果就是图层的出现和图层的消失。不同于其他基于属性的动画(改变图层的某一属性),过渡动画操纵图层缓存图片来创建的视觉效果(单独的改变某一属性是很难或者可以说不可能完成的)。标准的过渡动画包括reveal,push,move,和crossfade动画。

要实现过渡动画,你需要创建一个CATransition对象并将其添加进涉及到的图层。当使用过渡类酒必须制定过渡类型和动画的开始点和结束点。这期间的动画你就不必过度关注了。

5-1的代码就演示了如何在两个view之间创建一个push过渡动画。在该例中,myView1和myView2都在父视图的同一位置,但是只有myView1是当前可见的。push过渡动画将产生myView1 左侧划出然后myView2右侧划入。在动画的结束后需要确保改变两个视图的可见性。

Listing 5-1  Animating a transition between two views in iOS

CATransition* transition = [CATransition animation];

transition.startProgress = 0;

transition.endProgress = 1.0;

transition.type = kCATransitionPush;

transition.subtype = kCATransitionFromRight;

transition.duration = 1.0;

 

// Add the transition animation to both layers

[myView1.layer addAnimation:transition forKey:@"transition"];

[myView2.layer addAnimation:transition forKey:@"transition"];

 

// Finally, change the visibility of the layers.

myView1.hidden = YES;

myView2.hidden = NO;


当两个图层涉及到同样的过渡动画时,可以使用为两个视图使用同一个过渡对象。使用同一个过渡对象也简化了你所需要编写的代码。然而,如果两个过渡类型不同就需要分别创建过渡对象。



定义动画的定时

定时对于动画十分重要,使用CA你可以使用CAMediaTiming协议protocal精准的定时动画。两个两个CA类实现该了协议。CAAnimation 类实现了该协议,所以你只需要提供定时信息就可以。CALayer同时也实现了该协议,所以你也可以为隐示动画设置某些定时相关的特性。尽管隐示过渡对象默认封装了这项动画,但是需要预先提供定时信息。

考虑关于使用定时和动画的时候,需要知道图层对象是如何管理时间。每个图层都有自己的局部时间用来管理动画定时的。通常来说,两个图层间的局部时间都十分接近,不用特别的在意。但是子图层的局部时间可以被父图层的局部时间参数所改变。比如改变了图层的speed属性,同时也改变了其子图层了动画持续时间。

在某一特定图层,为了帮助你确定图层的时间是否合适,CALayer类定义了convertTime:fromLayer和convertTime:toLayer方法。你可以将一个固定的时间复制给图层的局部时间属性或者将一个图层的局部时间专程另外一个图层的局部时间。5-3示例说明了通常如何从一个图层获得图层的局部时间。

Listing 5-3  Getting a layer’s current local time

CFTimeInterval localLayerTime = [myLayer convertTime:CACurrentMediaTime() fromLayer:nil];


在得到图层的局部时间之后,你就可以用该局部时间来更新与定时相关的动画对象或者图层。通过这些定时属性,你可以达到以下有趣的动画效果。

1.使用beginTime属性来开始动画,通常来说,动画开始在以下次的更新循环。你可以使用beginTime参数类演示动画的起始时间。这样就可以链接两个动画。

如果延迟动画的起始时间,你可能也想要设置fillMode属性成kCAFillModeBackWards。该fillmode讲会使你的动画图层起始时间播发,即使图层树包涵了完全不同的值。如果么有该fill Mode,你将会看到在动画执行前,突然跳到最后值。

2.autoreverses属性会让动画在特定的时间内执行,然后结束后回到起始动画的起始值。可以结合repeatCount属性来让动画多次的重复。

3.使用timeOffset属性,可以让一组动画中的某些动画比其他动画晚执行。



暂停和恢复动画

想要暂停动画,你可以利用图层实现了CAMediaTiming协议的特性,将图层的speed设置为0.speed设置为0将会暂停动画,直到你将该值改变成一个非0值。5-4就是这么一个简单的例子。(暂停和恢复动画)

Listing 5-4  Pausing and resuming a layer’s animations

-(void)pauseLayer:(CALayer*)layer {

   CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];

   layer.speed = 0.0;

   layer.timeOffset = pausedTime;

}

 

-(void)resumeLayer:(CALayer*)layer {

   CFTimeInterval pausedTime = [layer timeOffset];

   layer.speed = 1.0;

   layer.timeOffset = 0.0;

   layer.beginTime = 0.0;

   CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;

   layer.beginTime = timeSincePause;

}

显示使用Transactions改变Animation参数

每一次你改变图层,就是transaction的一部分。CATranscation类管理创造和组织动画以及动画的执行。大多数情况下,你不要创建你自己的transaction。无论何时,给图层添加一个隐示或者显示动画时候,CA自动隐示的创建transcation。可以显示的创建transcations更加精准的管理动画。

你可以使用CATransaction类的方法创建和管理transactions。开始一次新的transaction调用begin类方法,结束transaction调用commit类方法。这两次调用之间,就是你所做的图层改变。比如下例。

Listing 5-5  Creating an explicit transaction

[CATransaction begin];

theLayer.zPosition=200.0;

theLayer.opacity=0.0;

[CATransaction commit];

使用显示transcation的主要原因,就是你可以改变持续时间,定时函数,和其他的参数。你可以将一个完成块赋值给整个transcation,那样你的app将在一组动画结束后得到通知。改变动画的参数需要合适的key,使用setValue:forkey方法。比如将动画的默认持续时间改成10秒,你就要使用kCATranscationAnimationDuration key。就像5-6。

Listing 5-6  Changing the default duration of animations

[CATransaction begin];

[CATransaction setValue:[NSNumber numberWithFloat:10.0f]

                 forKey:kCATransactionAnimationDuration];

// Perform the animations

[CATransaction commit];


你也可以嵌套transaction,来提供不同的默认值。嵌套一个transaction在另外一个transaction里面,只要调用begin类方法。每一个begin匹配一个commit。只有当你完成最外部的transaction commit后,所关联的动画才开始。

5-7示例了如何嵌套transaction

Listing 5-7  Nesting explicit transactions

[CATransaction begin]; // Outer transaction

 

// Change the animation duration to two seconds

[CATransaction setValue:[NSNumber numberWithFloat:2.0f]

                forKey:kCATransactionAnimationDuration];

// Move the layer to a new position

theLayer.position = CGPointMake(0.0,0.0);

 

[CATransaction begin]; // Inner transaction

// Change the animation duration to five seconds

[CATransaction setValue:[NSNumber numberWithFloat:5.0f]

                 forKey:kCATransactionAnimationDuration];

 

// Change the zPosition and opacity

theLayer.zPosition=200.0;

theLayer.opacity=0.0;

 

[CATransaction commit]; // Inner transaction

 

[CATransaction commit]; // Outer transaction


添加透视进你的动画。

实际上app是以3D的方式操纵图层,但是为了便利,CA显示图层以2D的方式。本质上说就是做了切片处理。3D行为可以设置zPosition值来设置。就像太阳照射某一物体的时候,越远离投影面的物体产生的投影越小,越接近投影面的投影越大那样。zPosition越大,那么图层就看起来越扁平。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值