Core Animation
来源:互联网 发布:克里米亚女检察长知乎 编辑:程序博客网 时间:2024/04/28 13:05
1.Core Animation:核心动画。他是一组非常强大的动画处理API。
动画处理过程都是在后台操作,不会阻塞线程。
直接作用在CALayer上,并非UIView。
2.Core Animation的使用步骤:
(1)首先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.framework>
(2)初始化一个CAAnimation对象,并设置一些动画相关属性。
(3)通过调用CALayer的addAnimation:forKey:方法增加 CAAnimation对象到CALayer,这样就能开始执行动画了。
(4)通过CALayer中的removeAnimationForKey :方法可以停止 CALayer中的动画。
3.CAAnimation
从前面看出,想要执行动画,就必须初始化一个CAAnimation对象。
其实,一般情况下,我们使用的都是CAAnimation的子类,我们先大致看一下CAAnimation的继承结构:
黑线代表继承,黑色文字代表类名,白色文字代表属性。其中CAMediaTiming是一个协议( protocol )。
(1)CAAnimation的常用属性 (**CAAinmation是所有动画的父类,但他不能直接使用,应该使用它的子类)。
常见属性有:
duration 动画持续时间
repeatCount 动画的持续次数
timingFunction 控制动画运行的节奏
timingFunction 可选值有:
KCAMediaTimingFunctionLinear (线性):匀速,给你一个相对静态的感觉。
KCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开。
KCAMediaTimingFunctionLinear (渐出):动画全速进入,然后减速地到达目的地。
KCAMediaTimingFunctionEaseInEaseOut (渐进渐出):动画缓慢进入,中间加速,然后减速到达目的地。缺省动画行为。
delegate 动画代理,用来监听动画的执行过程
代理对象需要实现的方法有:(这几个方法被定义在某个分类中)
@interface NSObject (CAAnimationDelegate)
//动画开始执行的时候触发这个方法
(void)animationDidStart:(CAAnimation *)anim;
//动画执行完毕的时候触发这个方法
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
//上面介绍的所有属性都是属于CAAnimation的,因此,CAAnimation的所有子类都能使用它们。
(2)其他
CAPropertyAnimation也是不能直接使用的,也要使用它的子类
所以,能用的动画类只有四个了。CABasicAnimation,CAKeyframeAnimation,CATransAnimation,CAAnimationGroup。
4.CAPropertyAnimation
CAPropertyAnimation是CAAnimation的子类,不能直接使用,要想创建动画,要使用它的两个子类,CABasicAnimation和CAKeyframeAnimation
它有个NSString类型的 keyPath 属性,你可以指定CALayer的某个属性名为 keyPath ,并且对属性的值修改,达到相应的动画的效果。比如,指定@“position” 为 keypath ,就会修改CALayer 的 position 属性的值,以达到平移的动画效果。
因此,初始化好CAPropertyAnimation的子类对象后,必须先设置keyPath, 搞清楚要修改的是CALayer的哪个属性,执行的是怎样的动画。
5. CABasicAnimation
CABasicAnimation是CAPropertyAnimation的子类,使用它可以实现一些基本的动画效果,它可以让CALayer的某个属性某个值渐变到另一个值。下面就用CABasicAnimation实现几个简单的动画。
先初始化一个UIView添加到控制器的view中,然后在这个UIView的layer上执行动画,下面的self是指控制器。
UIView *_myView = [[UIView alloc]init];
_myView.layer.position = CGPointMake(100, 100);
_myView.layer.bounds = CGRectMake(0, 0, 100, 100);
_myView.backgroundColor = [UIColor blueColor];
[self.view addSubview:_myView];
[_myView release];
//说明这个动画对象要对CALayer的position属性执行动画 ,执行平移动画
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
//动画持续时间1.5s
anim.duration = 1.5;
//position属性值从(50,80)渐变到(300,350) byValue代表CAlayer从位置(50,80)移动到(350,430)位置
anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 350)];
//设置动画代理
anim.delegate = self;
//保持动画执行后的状态
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
//默认动画执行完毕后,动画会自动从CALayer上移除,CALayer又会回到原来的状态。为了保持动画执行后的状态,加入以上两行代码
//添加动画到对象图层上
[_myView.layer addAnimation:anim forKey:@"translate"];
//可以设置动画的代理,可以监听动画的执行过程,这里设置控制器为代理,代理需要实现的方法:
#pragma mark 动画开始
-(void)animationDidStart:(CAAnimation *)anim{
NSLog(@"动画开始了");
}
#pragma mark 动画结束
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
//查看一下动画执行完毕后的position值
NSString *string = NSStringFromCGPoint(_myView.layer.position);
NSLog(@"动画结束了,position:%@",string);
}
//打印结果: 动画开始了 动画结束了,position:{100,100}
//动画执行完毕后,并没有真正的改变CALayer的position的属性值。
方法二:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
//动画持续时间1.5s
anim.duration = 1.5;
CATransform3D from = CATransform3DMakeTranslation(350, 350, 0);
anim.toValue = [NSValue valueWithCATransform3D:from];
[_myView.layer addAnimation:anim forKey:nil];
//通过CALayer的transform属性实现平移动画,layer会从自己的初始位置平移到(350,350)位置
(2)缩放动画
方法一:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
anim.duration = 2;
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];
[_myView.layer addAnimation:anim forKey:nil];
方法二:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1.5;
anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)];
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)];
[_myView.layer addAnimation:anim forKey:nil];
(3)旋转动画:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1.5;
//绕着(0,0,1)这个向量轴顺时针旋转45°
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 0, 0, 1)];
[_myView.layer addAnimation:anim forKey:nil];
(4)其他
除开前面的position,transform 属性,其实CALayer还有好多属性都可以形成动画,这些属性统称为“AnimatableProperties”。在CALayer中将介绍。
CABasicAnimation虽然能够做很多基本的动画效果,但是有个局限性,只能让CALayer个属性从某一值渐变到某一值。仅仅是在这两个值之间渐变。
- core animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core Animation
- Core animation
- Core Animation
- Core Animation
- Core Animation
- CALayer -- 层的属性
- Access数据库如何添加数据源(ODBC)?
- actionscript与javascript交互实例(修改)
- Please ensure that adb is correctly located at
- 互联网视频
- Core Animation
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- 程序员求职之道(《程序员面试笔试宝典》)之民间的企业排名的可信度到底有多大?
- DIV 和 SPAN 区别
- jquery的一些函数
- Objective-C的hook方案(一): Method Swizzling
- 字符缓存
- javascript innerHTML、outerHTML、innerText、outerText的区别
- MFC关闭进程和更改已知标题窗口的标题