ios 学习动画的套路 (一)

你也肯定喜欢炫酷的动画!

在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟~不知道从哪里下手去写!会连续的发两篇博客,总结一下iOS中动画的一个学习套路或者说是一个自己的学习的过程,以及当中出现的一些问题也会和大家分享。

一:从那里开始?这里 Quartz2D!

在我的学习过程中,我是先从 Quartz2D 开始学习的,它里面的贝塞尔曲线在我们创造精美的动画的过程中是必不可少的,Quartz 2D 它首先就是一个二维绘图引擎,同时支持iOS和Mac系统。下面这里一篇不错的文章,仔细的讲解了 Quartz 2D。想制作精美的动画,你就得懂Quartz 2D里面的贝塞尔曲线!你要仔细的学习了上面链接里面的内容,我想你也就掌握了 Quartz2D 了。

二: 接下来看看这个! CADisplayLink

就是这个 CADisplayLink,简单地说它就是一个定时器!定时器大家最熟悉的可能就是 NSTime了吧,那 CADisplayLink 和 NStime 又有什么区别呢?带着这些疑问往下看。

    是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和 selector在屏幕刷新的时候调用。

一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。例如一个视频应用使用时间戳来计算下一帧要显示的视频数据。在UI做动画的过程中,需要通过时间戳来计算UI对象在动画的下一帧要更新的大小等等。 NStime 的精确度就显得低了点,

它们还是有很大的区别的,这是我们博客园的伙伴总结的 定时器,写的很详细了,可以进去看看他们俩的区别。它们俩的创建看下面

   // 创建 NSTimer 定时器
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
    // 停止定时器
    [timer invalidate];

   // 创建CADisplayLink 定时器
    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(test:)];
    // 将创建的displaylink添加到runloop中,否则定时器不会执行
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    // 停止定时器
    [displayLink invalidate];
    displayLink = nil;

在下面的第四点我会给出它的不错的学习和应用的链接给大家!

三:先说说系统的吧!

(1) CALayer 实际上UIView是对CALayer封装,在CALayer的基础上再添加交互功能。UIView的显示必须依赖于CALayer。我们同样可以跟新建view一样新建一个layer,然后添加到某个已有的layer上,同样可以对layer调整大小、位置、透明度等。 具体讲CAlayer的属性

(2) UIBezierPath (贝塞尔曲线)这里有具体讲到贝塞尔曲线!

(3) CAAnimation

首先 CAAnimation 可以分为以下几类:

  • CABasicAnimation
      基础动画,通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation
  • CAKeyframeAnimation
      关键帧动画,可定制度比CABasicAnimation高,也是本系列的接下来的内容
  • CAAnimationGroup
      组动画,支持多个CABasicAnimation或者CAKeyframeAnimation动画同时执行

下面链接的文章能帮助大家很好的学习 CAAnimation!感谢作者!大家好好看看!

iOS动画(一)

iOS动画(二)

学完看看这个,经典的淘宝购物车效果:立即抢购图标会大致按照下面的贝塞尔曲线运动到购物车,完后消失,给大家附上大概的思路代码!代码写其实挺简单的,你完全可以试试!

-(void)buttonclick
{

    // http://www.jianshu.com/p/69caa3b68b43/comments/1352880  CAlay 详解
    layer = [[CALayer alloc]init];
    layer.frame = imageV.frame;
    // 包含的内容
    layer.contents = (__bridge id _Nullable)(imageV.image.CGImage);
    // 透明度
    layer.opacity = 1;
    [self.view.layer addSublayer:layer];

    // 起点和终点
    CGPoint starpoint = imageV.center;
    CGPoint stoppoint =  CGPointMake(self.view.bounds.size.width - 50, 300);

    // 贝塞尔曲线
    // http://www.jianshu.com/p/734b34e82135  贝塞尔曲线详解
    UIBezierPath * path = [UIBezierPath bezierPath];
    // 曲线的开始位置
    [path moveToPoint:starpoint];
    // 控制点
    CGPoint coltrolpoint = CGPointMake(starpoint.x + (stoppoint.x - starpoint.x)/3, 0);
    // 添加二维曲线
    [path  addQuadCurveToPoint:stoppoint controlPoint:coltrolpoint];

    CAKeyframeAnimation * animation =  [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.path = path.CGPath; // CGPath CGPathRef类型
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    animation.delegate=self;
    animation.duration = 0.8;
    animation.autoreverses = NO;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [layer addAnimation:animation forKey:@"buy"];

}
-(void)animationDidStop:(CAKeyframeAnimation *)anim finished:(BOOL)flag
{
    [layer removeFromSuperlayer];

}

四:已经能擦出火花了

你要了解了上面说的贝塞尔曲线和CADisplayLink,它俩碰撞其实已经能擦出火花了!你要真的认真的学习我上面不管是我写的还是给大家链接里面我们的同行写的博客,我相信基本的动画大家其实已经也差不多够用了,关在在于你怎么样去灵活的用它。

最后在给大家一篇博客, CADisplayLink结合UIBezierPath的神奇妙用 就算是对上面只是的一个总结,这里面的动画都是有git源码的,你可以下载下来好好去研究研究!

我会在这个系列的下一篇给大家介绍常用的动画三方库FaceBook出品的 pop 和 Canvas !

时间: 2024-10-03 21:58:23

ios 学习动画的套路 (一)的相关文章

IOS学习动画一之 UIKit动画

IOS的 普通动画可使用UIKit提供的动画方式: 复杂动画可使用Core Animation. 1. 通过动画上下文使用UIKit动画 -(void)animationOfUIKit  {       UIView *redView=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 100, 100)];              [self.view addSubview:redView];       //开始动画       [UIView 

iOS动画详解(学习动画看这一篇就够了)

iOS动画详解(学习动画看这一篇就够了) 一.基础知识 CAAnimation.png 二.CABasicAnimation 1. 动画的属性和解释 2.属性值的解释 repeatCount : 如果在swift中需要一直不断重复:Float.infinity,OC:HUGE_VALF timingFunction: timingFunction.png kCAMediaTimingFunctionLinear--在整个动画时间内动画都是以一个相同的速度来改变.也就是匀速运动.一个线性的计时函数

iOS核心动画学习整理

最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一些知识做了相应的整理,整理为demo(https://github.com/PurpleSweetPotatoes/Layer_learn).此demo中都是基于教程书籍中的编程示例,并加上了注解以方便各位iOS爱好者学习使用. 在这里利用此教程中的基础知识做了2个小demo,活动指示器效果和火焰效

iOS学习笔记10-UIView动画

上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UIView动画封装 一.UIView动画 苹果知道图层动画使用麻烦,就为我们封装到了UIView里,使我们可以简单的实现各种动画效果. 1. 基础动画 主要实现方法为: + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTime

IOS学习02简单动画

IOS学习第二天,今天做一个简单的动画的小程序! 程序截图如下: 1 这个程序,当点击屏幕左下方4个方向按键的时候,上面的图片就会跟着自动上下左右移动. 2 当点击屏幕右边变大和变小按键时候,上面的图片就会跟着变大和变小. 二 功能就说到这里,下面开始界面和代码说明. 2.1 首先还是先创建项目和设计界面,当然还要把相对应的图片导入项目images.xcassets下.截图如下: 2.2 界面图片和方向键,在这里我都是用Button做的,当然,用别的也可以. 2.3 界面上所以可以点击的按键,我

iOS之动画学习笔记一

iOS复杂动画都是和贝塞尔曲线结合在一起的.因此要学会iOS动画,必须先理解贝塞尔曲线.贝塞尔曲线的教程网上很多,这里就不过多的阐述.主要还是来讲讲有关动画方面的东西. 一.画一条简单的曲线 我们先准备一条波浪形的贝塞尔曲线: CGPoint startPoint = CGPointMake(50, 300); CGPoint endPoint = CGPointMake(300, 300); CGPoint onePoint = CGPointMake(150, 200); CGPoint t

iOS核心动画

iOS开发系列--让你的应用“动”起来 --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单: CALayer CALayer简介 CAL

2015最新iOS学习线路图

iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置的众多技术和功能让 Apple设备始终保持着遥遥领先的地位. iOS学习路线:http://www.mobiletrain.org/page/ios.html 课程分  类 课程模块 模块介绍 课程内容 Part1C语言 C语言和Objective-C语言 C语言 Mac系统及常用工具.进制:C数据

iOS学习笔记(3)— 屏幕旋转

iOS学习笔记(3)— 屏幕旋转 一.屏幕旋转机制: iOS通过加速计判断当前的设备方向和屏幕旋转.当加速计检测到方向变化的时候,屏幕旋转的流程如下: 1.设备旋转时,系统接收到旋转事件. 2.系统将旋转事件通过AppDelegate通知当前的主Window. 3.window通知它的rootViewController. 4.rootViewController判断所支持的旋转方向,完成旋转. iOS系统中屏幕旋转事件没有像触碰事件那样进行hitTest,所以只有rootViewControl