核心动画CoreAnimation,快速入手动画

关于动画这一块,之前由于用的很少,也很少有研究,最多停留在UIView的基本动画上。最近学习了一下核心动画CoreAnimation,主要是显式动画以及关键帧动画,这些都是动画深入的基础,挺受益的,现在将一些心得写下来。

先来认识两个关键词:
CALayer:图层类
CAAnimation:动画类
打个比方来说,比如拍电影,会有演员,而CALayer在这里就充当演员的角色,不管干啥,都会去操纵这个CALayer去做若干操作,除了演员,我们还需要剧本,CAAnimation在这里就是剧本,告诉演员CALayer怎么去做。
CAAnimation在这里我介绍一下显式动画和关键帧动画,两者的区别在于后者能够顺着我们设定的路线进行移动,前者则是做一些本身的动画效果。

直接贴代码
1.CABasicAnimation显式动画

1.先定义一个imageView

    UIImageView *imgView = [[UIImageView alloc   ] initWithImage:[UIImage imageNamed:@"jour"]];
    imgView.frame = CGRectMake(150, 300, 80, 100);
    [self.view addSubview:imgView];

2.选定角色,指定角色CALayer为imgView的layer图层

    CALayer *imgLayer = [[CALayer alloc] init];
    imgLayer = imgView.layer;

3.写剧本,显示动画类CABasicAnimation

//写第一个剧本
    CABasicAnimation *scaleAnimate = [CABasicAnimation animationWithKeyPath:@"transform.scale"];//x,y轴同时缩放的keypath
    scaleAnimate.fromValue = [NSNumber numberWithFloat:1.0]; //缩放倍数
    scaleAnimate.toValue = [NSNumber numberWithFloat:1.5];
    scaleAnimate.autoreverses = YES; //造成回路
    scaleAnimate.repeatCount = MAXFLOAT; //无限重复
    scaleAnimate.duration = 2.0; //每组间隔
    
    //写第二个剧本,用来透明(时隐时现)
    CABasicAnimation *opaqueAnimate = [CABasicAnimation animationWithKeyPath:@"opacity"]; //opacity是透明的keypath
    opaqueAnimate.fromValue = [NSNumber numberWithFloat:0.0];
    opaqueAnimate.toValue = [NSNumber numberWithFloat:1.0];
    opaqueAnimate.autoreverses = YES;
    opaqueAnimate.repeatCount = MAXFLOAT;
    opaqueAnimate.duration = 2.0;
    
    //第三个剧本,旋转
    CABasicAnimation *xuanzhuanAnimate = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; //根据z轴来旋转
    xuanzhuanAnimate.fromValue = [NSNumber numberWithFloat:0];
    xuanzhuanAnimate.toValue = [NSNumber numberWithFloat:3.1415926];
    xuanzhuanAnimate.repeatCount = MAXFLOAT;
    xuanzhuanAnimate.removedOnCompletion = YES;
//    xuanzhuanAnimate.autoreverses = YES;  
     xuanzhuanAnimate.duration = 2.0;

4.把剧本交给演员开始动画

//把剧本交给演员开始动画
    [imgLayer addAnimation:scaleAnimate forKey:nil];
    [imgLayer addAnimation:opaqueAnimate forKey:nil];
    [imgLayer addAnimation:xuanzhuanAnimate forKey:@"animateTransform"]; 

上面加了三个剧本效果,效果如下:

xuanzhuan.gif

2.再来介绍一下关键帧动画CAKeyframeAnimation
关键帧动画是根据几个点的位置,然后来回移动的,所以涉及到position

    UIImageView *photoView = [[UIImageView alloc   ] initWithImage:[UIImage imageNamed:@"jour"]];
    photoView.frame = CGRectMake(150, 400, 80, 100);
    [self.view addSubview:photoView];
   //选角
     CALayer *photoLayer = photoView.layer;
//设定关键帧,从第一个点,到最后一个点,再到第一个点(先设置所有点的位置)
    NSValue *valueOne = [NSValue valueWithCGPoint:photoLayer.position];
    NSValue *valueTwo = [NSValue valueWithCGPoint:CGPointMake(photoLayer.position.x, photoLayer.position.y +200)];
    NSValue *valueThree = [NSValue valueWithCGPoint:CGPointMake(photoLayer.position.x - 150, photoLayer.position.y +200)];
    NSValue *valueFour = [NSValue valueWithCGPoint:CGPointMake(photoLayer.position.x - 150, photoLayer.position.y)];
    NSValue *valueFive = [NSValue valueWithCGPoint:photoLayer.position];
    keyAnimate.values = @[valueOne,valueTwo,valueThree,valueFour,valueFive];
    keyAnimate.autoreverses = false;
    keyAnimate.repeatCount = MAXFLOAT;
    keyAnimate.duration = 10.0;

//上面的曲线是个矩形,总共有四段,所以接下来设置每段的移动速度

    CAMediaTimingFunction *tfOne = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];//先慢 后慢 中间快
    CAMediaTimingFunction *tfTwo = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];//匀速
    CAMediaTimingFunction *tfThree = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];//先慢
    CAMediaTimingFunction *tfFour = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];//后慢
    keyAnimate.keyTimes = @[@"0.0",@"0.1",@"0.8",@"0.9",@"1"];//这个属性设置的话,就是用来控制各区间段的运动速率的,第一段就是0.1-0.0,第二段就是0.8-0.1以此类推,范围是在0-1之间,这是倍数,再乘以上面的duration就是个分段的运行时间
    keyAnimate.timingFunctions = @[tfOne,tfTwo,tfThree,tfFour];

//开始

//start
    [photoLayer addAnimation:keyAnimate forKey:nil];

该关键帧动画效果如下:

timeZ.gif

如果您喜欢我的文章请点个赞~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容