CAAnimation的基本概念

原创 2015年11月17日 20:59:20

CAAnimation:所有动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类.

使用Core Animation创建动画不仅简单,而且具有更好的性能,原因有2个:

1)Core Animation动画在单独的线程中完成,不会阻塞主线程。

2)Core Animation动画只会重绘界面变化的部分(局部刷新).

Core Animation动画涉及下面API(简单介绍一下):

CAAnimation: 它是所有动画类的基类,它实现了CAMediaTiming协议,提供了动画的持续时间,速度和重复计数等。CAAnimation还实现了CAAction协议,该协议为CALayer动画触发的动作提供了标准话的响应。

CATransition: CAAnimation的子类,CAAnimation可通过预置的过渡效果来控制CALayer层的过渡动画。

CAPropertyAnimation:它是CAAnimation的一个子类,它代表一个属性动画,可通过+ (instancetype)animationWithKeyPath:(NSString *)path;类方法来创建属性动画实例,该方法需要指定一个CALayer支持动画的属性,然后通过它的子类(CABasicAnimation,CAKeyframeAnimation)控制CALayer的动画属性慢慢地改变,即可实现CALayer动画。

CABasicAnimation: CAPropertyAnimation的子类,简单控制CALayer层的属性慢慢改变,从而实现动画效果。很多CALayer层的属性值的修改默认会执行这个动画类,比如大小,透明度,颜色等属性。

CAKeyframeAnimation: CAPropertyAnimation的子类,支持关键帧的属性动画,该动画最大的特点在于可通过values属性设置多个关键帧,通过多个关键帧可以指定动画的各个阶段的关键值。

CAAnimationGroup: CAAnimation的子类,用于将多个动画组合在一起执行。

关系图如下:

这里写图片描述

相关属性解析:

removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards.

fillMode:决定当前对象在非active时间段的行为.比如动画开始之前,动画结束之后.

kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态.
kCAFillModeBackwards 在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始。
kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.

delegate:动画代理
@property(retain) id delegate
为CAAnimation设置代理。默认为nil。
注意:一个CAAnimation实例,不能设置delegate为self。会引起循环引用。

@property(retain) CAMediaTimingFunction *timingFunction 速度控制函数,控制动画运行的节奏.

kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为.

CAAnimation实例方法
- (BOOL)shouldArchiveValueForKey:(NSString *)key
返回指定的属性值是否可以归档。
key:指定的属性。
YES:指明该属性可以被归档;NO:不能被归档。

CAAnimation协议方法

  • (void)animationDidStart:(CAAnimation *)theAnimation
    动画开始时,执行的方法。
    theAnimation:正在执行动画的CAAnimation实例。

  • (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
    动画执行完成或者动画为执行被删除时,执行该方法。
    theAnimation:完成或者被删除的动画实例

简单使用动画实现平移操作:

#import "MainViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface MainViewController ()

@property (weak, nonatomic) UIView *myView;

@end

@implementation MainViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIView *myView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
    [myView setBackgroundColor:[UIColor redColor]];

    [self.view addSubview:myView];
    self.myView = myView;
}

#pragma mark - 动画代理方法
#pragma mark 动画开始(极少用)
- (void)animationDidStart:(CAAnimation *)anim
{
    NSLog(@"开始动画");
}

#pragma mark 动画结束(通常在动画结束后,做动画的后续处理)
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    NSString *type = [anim valueForKey:@"animationType"];

    if ([type isEqualToString:@"translationTo"]) {
        // 1. 通过键值取出需要移动到的目标点
        CGPoint point = [[anim valueForKey:@"targetPoint"]CGPointValue];
        NSLog(@"目标点: %@", NSStringFromCGPoint(point));

        // 2. 设置myView的坐标点
        [self.myView setCenter:point];
    }

    NSLog(@"结束动画,myView: %@", NSStringFromCGRect(self.myView.frame));
}

#pragma mark - touch事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = touches.anyObject;
    CGPoint location = [touch locationInView:self.view];

    if ([touch view] == self.myView) {
        NSLog(@"点击myView");
    }

    [UIView animateWithDuration:1.0f animations:^{
        [self.myView setCenter:location];
    } completion:^(BOOL finished) {
        NSLog(@"%@", NSStringFromCGRect(self.myView.frame));
    }];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java-第2章 类与对象的基本概念

  • 2017年11月12日 14:27
  • 1.03MB
  • 下载

C语言基本概念

  • 2016年09月22日 11:11
  • 414KB
  • 下载

liferay 7.0 开发基本概念

谷歌翻译来源 模块 Liferay上构建的所有新应用程序,扩展和自定义均以模块化方式构建。模块是模块化体系结构中的单个分发和部署单元。 本着遵循现有标准的精神,Liferay利用了一套非常强大的O...

ospf基本概念

  • 2017年04月10日 10:35
  • 578KB
  • 下载

机器学习基本概念、机器学习的五大流派和演化、九种常见机器学习和深度学习算法

机器学习正在进步,我们似乎正在不断接近我们心中的人工智能目标。语音识别、图像检测、机器翻译、风格迁移等技术已经在我们的实际生活中开始得到了应用,但机器学习的发展仍还在继续,甚至被认为有可能彻底改变人类...

计算机网络 物理层的基本概念

  • 2015年04月24日 11:53
  • 643KB
  • 下载

操作系统学习-3. 进程的基本概念

操作系统学习-3. 进程的基本概念 写在前面:这一篇博客将学习进程的基本概念。...

类和对象的基本概念和用法

  • 2015年06月09日 17:59
  • 226KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CAAnimation的基本概念
举报原因:
原因补充:

(最多只允许输入30个字)