Core Animation之CABasicAnimation

Core Animation之CABasicAnimation

  • Core Animation 中文名称是核心动画
  • 跨平台
  • 不会阻塞主线程,动画执行都是后台操作的

CABasicAnimation-基本动画

  • CABasicAnimation是在Xcode5之后出现的,使用的时候需要用到QuartzCore.framework

  • 开发步骤

    • 首先要有一个CALayer
    • 初始化一个CAAnimation对象并设置一些动画相关属性
    • 通过调用CALayer的addAnimation:forKey:方法,将CAAnimation对象添加到CALayer中
    • 通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画
CAAnimation简介
  • 是所有动画对象的父类,负责控制动画的持续时间和速度、是个抽象类,不能直接使用,应该使用具体子类
  • 属性说明
    • duration:持续时间
    • repeatCount:重复次数,无线循环可以设置HUGE_VALF或者MAXFLOAT
    • repeatDuration:重复时间
    • removeOnCompletion: 默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到执行动画之前的状态。如果想要图层保持显示动画执行后的状态,那就设置为NO,同事设置fillMode为kCAFillModeForwards
    • fillMode:决定当前对象在非active时间段的行为
    • beginTime:可以用来设置动画延时执行,若想延迟2s,就设置为CACurrentMediaTIme()+2
    • CACurrentMediaTIme():图层的当前时间
    • timingFunction:速度控制函数,控制动画运行节奏
    • delegate:动画代理
动画填充模式
  • kCAFillModeForwards:当动画结束后,layer会一直保持着动画最后的状态

  • kCAFillModeBackwards:在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始

  • kCAFillModeBoth:这个其实就是上面两个合成,动画加入后,开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态

  • kCAFillModeRemoved:这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态

速度控制函数
  • kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉

  • kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开

  • kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地

  • kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。

    // 创建动画对象
    CABasicAnimation *anim = [CABasicAnimation animation];

    // 缩放
    anim.keyPath = @"transform.scale";
    // 位置
    anim.keyPath = @"position";

    // 缩放比例
    anim.toValue = @0.5;
    // 平移
    anim.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 200)];

    // 设置动画时长
    anim.duration = 2;

    // 取消反弹
    // 动画执行完毕之后不要把动画移除
    anim.removedOnCompletion = NO;

    // 保持最新的位置
    anim.fillMode = kCAFillModeForwards;

    // 重复动画的次数
    anim.repeatCount = MAXFLOAT;
    // 设置动画反转
    anim.autoreverses = YES;
    // 速度控制
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

    // 给图层添加了动画
    [_layer addAnimation:anim forKey:nil];
  • 当然了,还有一些代理方法,还有图层动画是可以控制暂停和恢复的
    // 暂停的方法
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];

    // 让CALayer的时间停止走动
    layer.speed = 0.0;
    // 让CALayer的时间停留在pausedTime这个时刻
    layer.timeOffset = pausedTime;

    // 恢复的方法
    CFTimeInterval pausedTime = layer.timeOffset;
    // 1. 让CALayer的时间继续行走
      layer.speed = 1.0;
    // 2. 取消上次记录的停留时刻
      layer.timeOffset = 0.0;
    // 3. 取消上次设置的时间
      layer.beginTime = 0.0;
    // 4. 计算暂停的时间(这里也可以用CACurrentMediaTime()-pausedTime)
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    // 5. 设置相对于父坐标系的开始时间(往后退timeSincePause)
      layer.beginTime = timeSincePause;

你可能感兴趣的:(Core Animation之CABasicAnimation)