详解CoreAnimation中如何自定义动画属性

移动开发 iOS
CoreAnimation在对CALayer进行动画生成时,需要用户指定对CALayer的哪一个属性进行插值,也就是必须声明成@property的变量,来看内容,

CoreAnimation中如何自定义动画属性是本文要介绍的内容,CoreAnimation可以对UIView里的CALayer进行动画处理。它的原理很简单,用户提供一个初始值,终点值和动画持续时间,CoreAnimation自动对 初始值,终点值之间,按照动画持续时间进行插值(生成中间值),生成中间帧,然后在一个单独的线程里进行播放,程序员就不再需要自己去绘制中间帧。

CoreAnimation在对CALayer进行动画生成时,需要用户指定对CALayer的哪一个属性进行插值,也就是必须声明成@property的变量,使用各个动画的虚拟超类CAPropertyAnimation的animationWithKeyPath方法来指定,例如下面的代码说明要对CALayer的postion属性进行插值。

  1. CABasicAnimation *aBasicAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 

在缺省情况下,能对 CALayer指定的动画属性是固定的,例如bounds,postion,可以在XCode的开发文档里查到,但是有的时候,我们需要对自定义的属性进行动画生成,这个就需要子类化CALayer,重载它的needsDisplayForKey方法

  1. + (BOOL)needsDisplayForKey:(NSString *)aKey {  
  2. if ([aKey isEqualToString:@"myProperty"]) {  
  3. return (YES);  
  4. } else {  
  5. return ([super needsDisplayForKey:aKey]);  
  6. }  

在这里,告诉CoreAnimation,我的CALayer子类有一个 myProperty属性,请对它进行动画插值。接下来,就可以重载

drawInContext方法,添加自己的关键帧绘画代码了。

子类化CALayer时,有个地方要注意,因为CoreAnimation在生成中间帧的方式,是通过Copy操作生成了一大堆中间帧用的CALayer,它在复制CALayer的数据时,只能对CALayer原有的属性成员进行copy,不会copy后添加的诸如对象引用一类的东西,这就需要程序员重载

  1. - (id)initWithLayer:(id)layer  
  2. {  
  3. self = [super initWithLayer:layer];  
  4. if(self != nil) {  
  5. MyLayer *myLayer = (MyLayer*)layer;  
  6. self.aUIImage = cl.aUIImage;  
  7. }  
  8. return (self);  

来生动copy一些没法自动copy的资源。

写些小提示,像 drawInContex之类的绘图方法中,尽量避免CGContextDrawImageInRect之类的元绘图调用,因为这些元绘图操作非常耗时,也是硬件加速帮不上忙的地方,尽量通过将CGImageRef传给CALayer.contents属性的方法把内容事先做好传给CALayer,然后通过仿射或者3D transform的方法来进行动画变换,  因为仿射或者3D transform是完全硬件加速的,它比自己书写绘图代码要快的多的多。

小结:详解CoreAnimation中如何自定义动画属性的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2009-08-04 13:35:16

ASP.NET自定义样

2011-03-17 09:45:01

Spring

2013-04-01 14:35:10

Android开发Android自定义x

2021-12-02 18:05:21

Android Interpolato动画

2009-06-10 14:02:11

netbeans自定义项目

2023-10-31 09:10:39

2022-09-21 14:42:03

JSProps属性

2022-06-20 08:26:39

Spring容器类型转换

2021-11-23 15:06:42

Kubernetes 运维开源

2013-06-27 11:10:01

iOS开发自定义UISlider

2009-08-06 17:13:56

ASP.NET自定义控

2011-08-02 11:17:13

iOS开发 View

2021-03-16 10:39:29

SpringBoot参数解析器

2015-10-12 16:47:13

iOS下拉线条动画

2019-12-02 21:29:45

Keras神经网络TensorFlow

2021-07-01 11:07:49

Swift 自定义操作符

2011-09-05 18:54:03

windowsUbuntu

2011-06-15 09:24:36

Qt Widget Model

2009-09-07 22:00:15

LINQ自定义

2010-01-18 15:43:35

VB.NET自定义属性
点赞
收藏

51CTO技术栈公众号