Core Animation(核心动画)的基本介绍与使用

Core Animation简介

  • Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。
  • Core Animation可以用在Mac OS X和iOS平台。
  • Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。
  • 要注意的是,Core Animation是直接作用在CALayer上的,并非UIView。

核心动画继承结构

  • 注意:图中的黑色虚线代表“继承”某个类,红色虚线代表“遵守”某个协议
    这里写图片描述

CAPropertyAnimation

  • 是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:
    • CABasicAnimation
    • CAKeyframeAnimation
  • 属性说明:

    • keyPath:通过指定CALayer的一个属性名称为keyPath(NSString类型),并且对CALayer的这个属性的值进行修改,达到相应的动画效果。比如,指定@“position”为keyPath,就修改CALayer的position属性的值,以达到平移的动画效果

CABasicAnimation——基本动画

  • 基本动画,是CAPropertyAnimation的子类

  • 属性说明:

    • fromValue:keyPath相应属性的初始值
    • toValue:keyPath相应属性的结束值
  • 动画过程说明:

    • 随着动画的进行,在长度为duration的持续时间内,keyPath相 应属性的值从fromValue渐渐地变为toValue
    • keyPath内容是CALayer的可动画Animatable属性
    • 如果fillMode=kCAFillModeForwards同时removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //  缩放,心脏跳动

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

    // 2.描述修改layer的属性
    anim.keyPath = keyPath(_imageView.layer, transform);

    // 3.修改layer的值
    anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)];

    // 设置动画执行次数
    anim.repeatCount = MAXFLOAT;

    // 4.添加到图层
    [_imageView.layer addAnimation:anim forKey:nil];

}

- (void)positionAnim
{
    // 动画的本质就是修改图层的某些属性

    // 核心动画,利用核心动画修改Layer某些属性

    // 1.创建核心动画
    CABasicAnimation *anim = [CABasicAnimation animation];

    // 2.描述修改Layer哪个属性
    anim.keyPath = keyPath(_redView.layer, position);

    // 3.描述修改layer属性的值
    // 动画的起点
    //    anim.fromValue =
    // 动画的终点     结构体转换为对象 用NSValue
    anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 400)];

    // 动画时长
    anim.duration = 1;

    // 取消反弹
    // 1.在动画完成的时候不要给我把动画销毁
    anim.removedOnCompletion = NO;

    // 2.动画永远保持最新的状态
    anim.fillMode = kCAFillModeForwards;


    // 添加核心动画
    [_redView.layer addAnimation:anim forKey:nil];
}

CAKeyframeAnimation——关键帧动画

  • 关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是:

    • CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值
  • 属性说明:

    • values:上述的NSArray对象。里面的元素称为“关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧
    • path:可以设置一个CGPathRef、CGMutablePathRef,让图层按照路径轨迹移动。path只对CALayer的anchorPoint和position起作用。如果设置了path,那么values将被忽略
    • keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的
  • CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 绕着圆走

    // 创建帧动画
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];

    anim.keyPath = @"position";

    // 创建路径
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:_imageView.center radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES];

    anim.path = path.CGPath;

    anim.repeatCount = MAXFLOAT;

    anim.duration = 2;

    [_imageView.layer addAnimation:anim forKey:nil];
}

- (void)anim
{
    // 帧动画
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];

    // 描述修改layer的属性,transform.rotation只能二维旋转
    anim.keyPath = @"transform.rotation";

    // 修改Layer值
    anim.values = @[@(angle2Radion(-5)),@(angle2Radion(5)),@(angle2Radion(-5))];

    anim.duration = 2;

    // 动画执行次数
    anim.repeatCount = MAXFLOAT;

    [_imageView.layer addAnimation:anim forKey:nil];
}

转场动画——CATransition

  • CATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点
  • UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果
  • 动画属性:
    • type:动画过渡类型
    • subtype:动画过渡方向
    • startProgress:动画起点(在整体动画的百分比)
    • endProgress:动画终点(在整体动画的百分比)
  • 转场动画过渡效果
    这里写图片描述
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 界面切换的代码
    static int i = 2;
    NSString *imageName = [NSString stringWithFormat:@"%d",i];
    _imageView.image = [UIImage imageNamed:imageName];

    i++;

    if (i > 3) {
        i = 1;
    }

    // 只要切换界面 都可以使用转场动画
    // 谁切换界面 就添加到谁上
    // 转场动画代码必须和界面切换的代码放在一起

    // 转场动画
    CATransition *anim = [CATransition animation];

    // 指定转场类型
    anim.type = @"pageCurl";
    // 设置转场的方向
    anim.subtype = kCATransitionFromLeft;

    // 设置动画的进度
    anim.startProgress = 0.5;

    anim.endProgress = 0.8;

    anim.duration = 3;

    [_imageView.layer addAnimation:anim forKey:nil];
}

CAAnimationGroup——动画组

  • 动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

  • 属性说明:

    • animations:用来保存一组动画对象的NSArray
    • 默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 动画组
    CAAnimationGroup *group = [CAAnimationGroup animation];

    // 平移
    CABasicAnimation *anim = [CABasicAnimation animation];

    anim.keyPath = @"position";

    anim.toValue = [NSValue valueWithCGPoint:CGPointMake(arc4random_uniform(300), arc4random_uniform(500))];

    // 缩放
    CABasicAnimation *anim1 = [CABasicAnimation animation];

    anim1.keyPath = @"transform.scale";

    anim1.toValue = @0.5;

    // 旋转
    CABasicAnimation *anim2 = [CABasicAnimation animation];

    anim2.keyPath = @"transform.rotation";

    anim2.toValue = @(M_PI);

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

    group.removedOnCompletion = NO;

    group.fillMode = kCAFillModeForwards;

    // 给动画组添加动画
    group.animations = @[anim,anim1,anim2];

    [_blueView.layer addAnimation:group forKey:nil];
}

// 核心动画一切都是假象,并不会真实的修改layer的属性

// UIView真实改变属性才能有动画

// 什么时候使用核心动画,什么时候使用UIView

// 如果以后在执行动画的过程中,不需要与用户交互,用核心动画

// 核心动画使用场景: 转场动画用的最多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值