• iOS动画


    =====================================================================

    iOS中有一种动画叫序列帧动画。把一系列图片放在数组中,通过播放图片产生动画效果。

    =================================================================

    //播放动画的方法

    -(void)startMyAnimat:(NSInteger)count name:(NSString*)name{

        

        //判断当前是否有动画在播放

        if (self.tomImage.isAnimating) return;

        //创建一个不可变的数组用于接收需要播放的图片

        NSMutableArray* animatArray = [NSMutableArray array];

        

        //通过循环给数组赋值

        for (int i = 0; i<count; i++) {

            //设置图片名字

            NSString* imageName = [NSString stringWithFormat:@"%@_%02tu",name,i];

            //设置图片地址

            NSBundle* bundle = [NSBundle mainBundle];

            NSString* path = [bundle pathForResource:imageName ofType:@"jpg"];

            UIImage* image = [UIImage imageWithContentsOfFile:path];

            //将图片写入数组

            [animatArray addObject:image];

            

        }

        //将图片数组赋值给animationImages

        self.tomImage.animationImages = animatArray;

        //设置运行次数

        self.tomImage.animationRepeatCount = 1;

        //设置播放时间

        self.tomImage.animationDuration = self.tomImage.animationImages.count*0.05;

        //动画开始

        [self.tomImage startAnimating];

        //设置一个动画时常的延迟,当动画播放完毕就将加载的图片清出内存

        [self performSelector:@selector(removeArray) withObject:nil afterDelay:self.tomImage.animationDuration];       

    }

    =======================================================================

    iOS中有一种动画叫UIView动画。线性动画可以轻松胜任。复杂的动画也是有的,叫做关键帧动画。

    ********************************线性动画*********************************************

    UIView的一般写法:

     [UIView beginAnimations:nil context:nil];

       //执行动画,动画执行时间

      [UIView setAnimationDuration:2.0];

      // 设置代理

      [UIView setAnimationDelegate:self];

     // 设置动画执行完毕调用的事件

      [UIView setAnimationDidStopSelector:@selector(didStopAnimation)];

       self.myView.center = CGPointMake(200, 300);

       [UIView commitAnimations]; 

    UIView的Block写法:

     [UIView animateWithDuration:3 animations:^{

            self.myView.center = CGPointMake(200, 300);

        } completion:^(BOOL finished) {

            [self didStopAnimation];

        }];

     *****************************************关键帧动画********************************************

    void (^keyFrameBlock)() = ^(){

            // 创建颜色数组

            NSArray *arrayColors = @[[UIColor orangeColor],

                                     [UIColor yellowColor],

                                     [UIColor greenColor],

                                     [UIColor blueColor],

                                     [UIColor purpleColor],

                                     [UIColor redColor]];

            NSUInteger colorCount = [arrayColors count];

            // 循环添加关键帧

            for (NSUInteger i = 0; i < colorCount; i++) {

          // 添加关键帧的方法

                [UIView addKeyframeWithRelativeStartTime:i / (CGFloat)colorCount

                                        relativeDuration:1 / (CGFloat)colorCount

                                              animations:^{

                                                  [_myView setBackgroundColor:arrayColors[i]];

                                              }];

            }

        };

     // 执行动画的方法

        [UIView animateKeyframesWithDuration:4.0

                                       delay:0.0

                                     options:UIViewKeyframeAnimationOptionCalculationModeCubic | UIViewAnimationOptionCurveLinear

                                  animations:keyFrameBlock

                                  completion:^(BOOL finished) {

                                      // 动画完成后执行

                                  }];

       

    ================================================================================================

    iOS中的还有一种动画叫核心动画,Core Animation(跨平台),来自QuartzCore.framework,超级的强大。可以做各种超级炫的动画,UIView动画搞不定的它都可以搞定。

    ================================================================================================

    CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类。

    常见属性有:

    duration:动画的持续时间

    repeatCount:动画的重复次数

    timingFunction:控制动画运行的节奏

    说明:(1)能用的动画类只有4个子类:CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup

         (2)CAMediaTiming是一个协议(protocol)。

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

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

    =============================================================================================================

    核心动画的序列帧动画(CAKeyFrameAnimation):

    *********************

    //创建核心动画

        CAKeyframeAnimation *keyAnim = [CAKeyframeAnimation animation];

        // 平移

        keyAnim.keyPath = @"position";

        NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];

        NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(200, 100)];

        NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(200, 200)];

        NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(100, 200)];

        NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];

        

        keyAnim.values = @[value1,value2,value3,value4,value5];

        //设置动画执行完毕后不删除动画

        keyAnim.removedOnCompletion = NO;

        // 设置保存动画的最新状态

        keyAnim.fillMode = kCAFillModeForwards;

        //设置动画执行的时间

        keyAnim.duration = 4.0;

        //设置动画的节奏

        keyAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

        // 设置代理 开始-结束

        keyAnim.delegate = self;

        // 添加核心动画

        [self.myView.layer addAnimation:keyAnim forKey:nil];

     =================================================

    核心动画的组动画(CAAnimationGroup):

    ********************************

    CAAnimationGroup*group = [[CAAnimationGroupalloc]init];
       
       //向动画组中添加动画
       //路径动画
       CAKeyframeAnimation*anim1 = [CAKeyframeAnimationanimationWithKeyPath:@"position"];
        anim1.path= [UIBezierPathbezierPathWithOvalInRect:CGRectMake(60,100,200,200)].CGPath;
       
       //旋转动画
       CABasicAnimation*anim2 = [CABasicAnimationanimationWithKeyPath:@"transform.rotation"];
        anim2.toValue=@(M_PI*10);
       
       //缩放动画
       CABasicAnimation*anim3 = [CABasicAnimationanimationWithKeyPath:@"transform.scale"];
        anim3.fromValue=@(1.0f);
        anim3.toValue=@(0.1f);
       
        group.animations=@[anim1, anim2, anim3];
       
       //动画时长,一组动画整体完成的时间
        group.duration=2.0f;

        [self.myView.layeraddAnimation:groupforKey:nil];

    ====================================================================

    核心动画CABasicAnimation(基本动画)

    CABasicAnimation *anima=[CABasicAnimation animation];

    //1.1告诉系统要执行什么样的动画

     anima.keyPath=@"position";

    //设置通过动画,将layer从哪儿移动到哪儿

     anima.fromValue=[NSValue valueWithCGPoint:CGPointMake(0, 0)];

     anima.toValue=[NSValue valueWithCGPoint:CGPointMake(200, 300)];

    //1.2设置动画执行完毕之后不删除动

    anima.removedOnCompletion=NO;

    //1.3设置保存动画的最新状态

    anima.fillMode=kCAFillModeForwards;

    //2.添加核心动画到layer

     [self.myLayer addAnimation:anima forKey:nil]; 

    =====================================================

    核心动画转场动画(CATransition)

    ****************************************

    - (IBAction)preClick:(id)sender {

        

        self.index --;

        if (self.index < 1) {

            self.index = 7;

    }

        self.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",self.index]];

        

        // 创建核心动画

        CATransition *ca = [CATransition animation];

        //要执行什么动画 设置过渡效果

        ca.type = @"cube";

        // 设置动画的过度方向

        ca.subtype = kCATransitionFromLeft;

        //设置动画时间

        ca.duration = 2.0;

        // 添加动画

        [self.imageView.layer addAnimation:ca forKey:nil];

        

        

    }

    - (IBAction)nextClick:(id)sender {

        self.index++;

        if (self.index > 7) {

            self.index = 1;

        }

        self.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",self.index]];

        //创建核心动画

        CATransition *ca = [CATransition animation];

        //要执行什么动画

        ca.type = @"cube";

        // 设置动画的过度方向

        ca.subtype = kCATransitionFromRight;

        //设置动画的时间

        ca.duration = 2.0;

        //设置动画的起点

        ca.startProgress = 0.5;

        // 添加动画

        [self.imageView.layer addAnimation:ca forKey:nil];

       }

    综上,iOS中的动画主要有序列帧动画,核心动画,UIView动画。

  • 相关阅读:
    简洁的JS代码片段
    1020. 飞地的数量
    Celery分布式任务队列
    C# 之 OpenFileDialog的使用
    Toad for SQL Server 优化记录
    go windows 后台运行
    Pytorch源代码完全解析S1
    Mybatis Plus动态代理源码分析
    Python常用脚本
    CocosCreator基于jenkins自动构建
  • 原文地址:https://www.cnblogs.com/peteremperor/p/6017002.html
Copyright © 2020-2023  润新知