Core Animation

来源:互联网 发布:在淘宝上开店要钱吗 编辑:程序博客网 时间:2024/04/28 16:47

1.Core Animation:核心动画。他是一组非常强大的动画处理API。

     动画处理过程都是在后台操作,不会阻塞线程。

     直接作用在CALayer上,并非UIView。

2.Core Animation的使用步骤:

    (1)首先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.framework>

    (2)初始化一个CAAnimation对象,并设置一些动画相关属性。

    (3)通过调用CALayer的addAnimation:forKey:方法增加 CAAnimation对象到CALayer,这样就能开始执行动画了。

    (4)通过CALayer中的removeAnimationForKey :方法可以停止 CALayer中的动画。

3.CAAnimation

    从前面看出,想要执行动画,就必须初始化一个CAAnimation对象。

    其实,一般情况下,我们使用的都是CAAnimation的子类,我们先大致看一下CAAnimation的继承结构:


黑线代表继承,黑色文字代表类名,白色文字代表属性。其中CAMediaTiming是一个协议( protocol )。

    (1)CAAnimation的常用属性 (**CAAinmation是所有动画的父类,但他不能直接使用,应该使用它的子类)。

        常见属性有:

        duration   动画持续时间

        repeatCount    动画的持续次数

        timingFunction     控制动画运行的节奏

            timingFunction 可选值有:

                    KCAMediaTimingFunctionLinear (线性):匀速,给你一个相对静态的感觉。

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

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

                    KCAMediaTimingFunctionEaseInEaseOut (渐进渐出):动画缓慢进入,中间加速,然后减速到达目的地。缺省动画行为。

        delegate    动画代理,用来监听动画的执行过程

            代理对象需要实现的方法有:(这几个方法被定义在某个分类中)

          @interface NSObject (CAAnimationDelegate)

   //动画开始执行的时候触发这个方法

          void)animationDidStart:(CAAnimation *)anim;


           //动画执行完毕的时候触发这个方法

           -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;


          @end

          //上面介绍的所有属性都是属于CAAnimation的,因此,CAAnimation的所有子类都能使用它们。


    (2)其他

    CAPropertyAnimation也是不能直接使用的,也要使用它的子类

    所以,能用的动画类只有四个了。CABasicAnimation,CAKeyframeAnimation,CATransAnimation,CAAnimationGroup。

4.CAPropertyAnimation

    CAPropertyAnimation是CAAnimation的子类,不能直接使用,要想创建动画,要使用它的两个子类,CABasicAnimation和CAKeyframeAnimation

    它有个NSString类型的 keyPath 属性,你可以指定CALayer的某个属性名为 keyPath ,并且对属性的值修改,达到相应的动画的效果。比如,指定@“position” 为 keypath ,就会修改CALayer 的 position 属性的值,以达到平移的动画效果。

    因此,初始化好CAPropertyAnimation的子类对象后,必须先设置keyPath, 搞清楚要修改的是CALayer的哪个属性,执行的是怎样的动画。

5. CABasicAnimation

    CABasicAnimation是CAPropertyAnimation的子类,使用它可以实现一些基本的动画效果,它可以让CALayer的某个属性某个值渐变到另一个值。下面就用CABasicAnimation实现几个简单的动画。

    先初始化一个UIView添加到控制器的view中,然后在这个UIView的layer上执行动画,下面的self是指控制器。

     UIView *_myView = [[UIViewalloc]init];

    _myView.layer.position =CGPointMake(100,100);

    _myView.layer.bounds =CGRectMake(0,0, 100, 100);

    _myView.backgroundColor = [UIColorblueColor];

    [self.viewaddSubview:_myView];

    [_myViewrelease];


    (1)平移动画
        方法一:    

    //说明这个动画对象要对CALayerposition属性执行动画 ,执行平移动画

    CABasicAnimation *anim = [CABasicAnimationanimationWithKeyPath:@"position"];

    //动画持续时间1.5s

    anim.duration =1.5;

    

    //position属性值从(5080)渐变到(300350   byValue代表CAlayer从位置(5080)移动到(350430)位置

    anim.fromValue = [NSValuevalueWithCGPoint:CGPointMake(50,80)];

    anim.toValue = [NSValuevalueWithCGPoint:CGPointMake(300,350)];

    

    //设置动画代理

    anim.delegate =self;

    

    //保持动画执行后的状态

    anim.removedOnCompletion =NO;

    anim.fillMode =kCAFillModeForwards;

    //默认动画执行完毕后,动画会自动从CALayer上移除,CALayer又会回到原来的状态。为了保持动画执行后的状态,加入以上两行代码

    

    //添加动画到对象图层上

    [_myView.layeraddAnimation:anim forKey:@"translate"];


    //可以设置动画的代理,可以监听动画的执行过程,这里设置控制器为代理,代理需要实现的方法:

    #pragma mark 动画开始

    -(void)animationDidStart:(CAAnimation *)anim{

        NSLog(@"动画开始了");

    }


    #pragma mark 动画结束

    -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

        //查看一下动画执行完毕后的position

        NSString *string = NSStringFromCGPoint(_myView.layer.position);

        NSLog(@"动画结束了,position:%@",string);

    }


    //打印结果:   动画开始了    动画结束了,position{100,100}

    //动画执行完毕后,并没有真正的改变CALayerposition的属性值。


      方法二:

       CABasicAnimation *anim = [CABasicAnimationanimationWithKeyPath:@"transform"];   

    //动画持续时间1.5s

    anim.duration =1.5;

    

    CATransform3D from =CATransform3DMakeTranslation(350,350, 0);

    anim.toValue = [NSValuevalueWithCATransform3D:from];

    [_myView.layeraddAnimation:anim forKey:nil];

    //通过CALayertransform属性实现平移动画,layer会从自己的初始位置平移到(350350)位置

    

     (2)缩放动画

     方法一:

       CABasicAnimation *anim = [CABasicAnimationanimationWithKeyPath:@"bounds"];    

    anim.duration =2;

    

    anim.toValue = [NSValuevalueWithCGRect:CGRectMake(0,0, 30, 30)];

    [_myView.layeraddAnimation:anim forKey:nil];

     方法二:

       CABasicAnimation *anim = [CABasicAnimationanimationWithKeyPath:@"transform"];      

    anim.duration =1.5;

    

    anim.fromValue = [NSValuevalueWithCATransform3D:CATransform3DMakeScale(0.5,0.5, 1)];

    anim.toValue = [NSValuevalueWithCATransform3D:CATransform3DMakeScale(2,1.5, 1)];

    

    [_myView.layeraddAnimation:anim forKey:nil];

       (3)旋转动画:

    CABasicAnimation *anim = [CABasicAnimationanimationWithKeyPath:@"transform"];

    anim.duration =1.5;

    

    //绕着(001)这个向量轴顺时针旋转45°

    anim.toValue = [NSValuevalueWithCATransform3D:CATransform3DMakeRotation(M_PI_4,0, 0,1)];

    [_myView.layeraddAnimation:anim forKey:nil];


      (4)其他

    除开前面的position,transform 属性,其实CALayer还有好多属性都可以形成动画,这些属性统称为“AnimatableProperties”。在CALayer中将介绍。

    CABasicAnimation虽然能够做很多基本的动画效果,但是有个局限性,只能让CALayer个属性从某一值渐变到某一值。仅仅是在这两个值之间渐变。


原创粉丝点击