COREANIMATION中如何自定义动画属性
2012-12-24 18:20
316 查看
CoreAnimation可以对UIView里的CALayer进行动画处理。它的原理很简单,用户提供一个初始值,终点值和动画持续时间,CoreAnimation自动对 初始值,终点值之间,按照动画持续时间进行插值(生成中间值),生成中间帧,然后在一个单独的线程里进行播放,程序员就不再需要自己去绘制中间帧。
CoreAnimation在对CALayer进行动画生成时,需要用户指定对CALayer的哪一个属性进行插值,也就是必须声明成@property的变量,使用各个动画的虚拟超类CAPropertyAnimation的animationWithKeyPath方法来指定,例如下面的代码说明要对CALayer的postion属性进行插值。
在缺省情况下,能对 CALayer指定的动画属性是固定的,例如bounds,postion,可以在XCode的开发文档里查到,但是有的时候,我们需要对自定义的属性进行动画生成,这个就需要子类化CALayer,重载它的needsDisplayForKey方法
在这里,告诉CoreAnimation,我的CALayer子类有一个 myProperty属性,请对它进行动画插值。接下来,就可以重载
drawInContext方法,添加自己的关键帧绘画代码了。
子类化CALayer时,有个地方要注意,因为CoreAnimation在生成中间帧的方式,是通过Copy操作生成了一大堆中间帧用的CALayer,它在复制CALayer的数据时,只能对CALayer原有的属性成员进行copy,不会copy后添加的诸如对象引用一类的东西,这就需要程序员重载
来生动copy一些没法自动copy的资源。
写些小提示,像 drawInContex之类的绘图方法中,尽量避免CGContextDrawImageInRect之类的元绘图调用,因为这些元绘图操作非常耗时,也是硬件加速帮不上忙的地方,尽量通过将CGImageRef传给CALayer.contents属性的方法把内容事先做好传给CALayer,然后通过仿射或者3D transform的方法来进行动画变换, 因为仿射或者3D transform是完全硬件加速的,它比自己书写绘图代码要快的多的多。
转自:http://www.cnblogs.com/uyoug321
CoreAnimation在对CALayer进行动画生成时,需要用户指定对CALayer的哪一个属性进行插值,也就是必须声明成@property的变量,使用各个动画的虚拟超类CAPropertyAnimation的animationWithKeyPath方法来指定,例如下面的代码说明要对CALayer的postion属性进行插值。
CABasicAnimation *aBasicAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
在缺省情况下,能对 CALayer指定的动画属性是固定的,例如bounds,postion,可以在XCode的开发文档里查到,但是有的时候,我们需要对自定义的属性进行动画生成,这个就需要子类化CALayer,重载它的needsDisplayForKey方法
+ (BOOL)needsDisplayForKey:(NSString *)aKey { if ([aKey isEqualToString:@"myProperty"]) { return (YES); } else { return ([super needsDisplayForKey:aKey]); } }
在这里,告诉CoreAnimation,我的CALayer子类有一个 myProperty属性,请对它进行动画插值。接下来,就可以重载
drawInContext方法,添加自己的关键帧绘画代码了。
子类化CALayer时,有个地方要注意,因为CoreAnimation在生成中间帧的方式,是通过Copy操作生成了一大堆中间帧用的CALayer,它在复制CALayer的数据时,只能对CALayer原有的属性成员进行copy,不会copy后添加的诸如对象引用一类的东西,这就需要程序员重载
- (id)initWithLayer:(id)layer { self = [super initWithLayer:layer]; if(self != nil) { MyLayer *myLayer = (MyLayer*)layer; self.aUIImage = cl.aUIImage; } return (self); }
来生动copy一些没法自动copy的资源。
写些小提示,像 drawInContex之类的绘图方法中,尽量避免CGContextDrawImageInRect之类的元绘图调用,因为这些元绘图操作非常耗时,也是硬件加速帮不上忙的地方,尽量通过将CGImageRef传给CALayer.contents属性的方法把内容事先做好传给CALayer,然后通过仿射或者3D transform的方法来进行动画变换, 因为仿射或者3D transform是完全硬件加速的,它比自己书写绘图代码要快的多的多。
转自:http://www.cnblogs.com/uyoug321
相关文章推荐
- 详解CoreAnimation中如何自定义动画属性
- 详解CoreAnimation中如何自定义动画属性
- 详解CoreAnimation中如何自定义动画属性
- 详解CoreAnimation中如何自定义动画属性
- LayoutAnimationController,补间动画,属性动画,值动画,自定义动画,帧动画
- Core Animation动画学习2——自定义CALayer的动画
- 如何用windows8 metro&windows phone自定义依赖属性绑定动画
- 属性动画资料文件如何编写?property-animation资源文件 属性动画如何自定义TypeEvaluator
- QPropertyAnimation动画的控件看不到以及构造函数的属性如何来
- 如何在XML中使用自定义Animation动画类
- CoreAnimation中如何自定义动画属性
- ios-day18-06(核心动画Core Animation简介、CAAnimation属性介绍)
- 属性动画:如何自定义View
- CAKeyframeAnimation path 绘制动画 和 《CALayer 自定义属性绘制动画》 的比较
- COREANIMATION中如何自定义动画属性
- Android使用属性动画如何自定义倒计时控件详解
- 如何给magento的产品分类创建一个自定义属性?
- Android自定义view之path类描绘二阶贝塞尔曲线+属性动画(模仿QQ账号信息曲线动画)
- Property Animation Part II(属性动画 第二部分)
- Android如何在动画时将View移出父布局/如何将View显示在父布局外(android:clipChildren属性)