关闭

CAAnimation的基本概念

342人阅读 评论(0) 收藏 举报

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));
    }];
}
0
0
查看评论

CAanimation动画 暂停,继续

停止: let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) layer.speed = 0.0 layer.timeOffset = pausedT...
  • yongyinmg
  • yongyinmg
  • 2014-09-29 18:40
  • 2358

CAAnimation抽象类及子类的详解

核心动画的详解介绍:CAAnimation(抽象类)   1、核心动画基本概念 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! 使用它需要先添加QuartzCore.framework和引入对应的框架 ,...
  • meiwenjie110
  • meiwenjie110
  • 2016-02-19 11:21
  • 700

iOS中CAAnimation的keyPath

animationWithKeyPath的值可以有以下这些: transform.scale = 比例转换transform.rotation = 旋转opacity = 透明度margin = 边距position = 位移backgroundColor = 背景颜色cornerRadiu...
  • yqyyyyy
  • yqyyyyy
  • 2016-01-30 21:53
  • 466

CAAnimation解读

CAAnimation解读 CAAnimation是一个抽象类,遵循了CAMediaTiming协议和CAAction协议!我们不要直接使用CAAnimation类,而是使用其子类: CATransition:提供渐变效果,如推拉push效果,消退fade效果,揭开reveal效果 CAAnimat...
  • woaifen3344
  • woaifen3344
  • 2015-12-08 19:13
  • 1343

CAAnimation动画小结

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

[CAAnimation核心动画练习一]普通的平移,旋转,缩放

[CAAnimation核心动画练习一]普通的平移,旋转,缩放
  • liyanq528
  • liyanq528
  • 2016-03-02 13:01
  • 1885

CAAnimation四种动画

在上一篇专题中我们提到,CAAnimation可分为以下四种: 1 2 3 4 5 6 7 8 1.CABasicAnimation 通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做...
  • Flying_in_the_world
  • Flying_in_the_world
  • 2016-04-13 16:07
  • 1800

CALayer扩展属性自定义CAAnimation动画

使用CA动画也有段时间了,相对都是比较基本的一些动画。使用的范围基本都是layer自己的animateble的属性。那对于CALayer子类扩展的属性该如何实现动画呢? 我想做一个圆形的进度条,通过CABasicAnimation动画更新progress,效果如下: 首先了解下layer自己的属...
  • GrowingGiant
  • GrowingGiant
  • 2015-01-07 15:07
  • 1911

我的iOS学习历程 - UIView动画与CAAnimation动画详解

CAAnimation 是一个抽象类 旗下三个子类 1.CAAnimationGroup 设置组动画 2.CAPropertyAnimation 属性动画 抽象类 旗下两个子 ① CABasicAnimation 基本动画 旋转 改变大小等 ② CAKeyframeAnima...
  • qwe845751403
  • qwe845751403
  • 2015-12-15 17:38
  • 319

QuartzCore 之 CAAnimation 动画详解

介绍: 核心动画, 提供丰富易用的API, 可以写出复杂交互性强的动画, 应用于Mac OS 和 iOS平台, 动画执行过程是在后台操作的, 不会影响主线程. 今天就来介绍一些API的示例使用. 下面的图很清楚了介绍了几个类之间的关系, 实际使用的过程中多使用以下几个CABasicAnimation...
  • sinat_30162391
  • sinat_30162391
  • 2016-11-09 00:26
  • 986
    个人资料
    • 访问:256771次
    • 积分:4611
    • 等级:
    • 排名:第7561名
    • 原创:205篇
    • 转载:1篇
    • 译文:12篇
    • 评论:19条
    最新评论