• iOS:核心动画之动画组CAAnimationGroup


    CAAnimationGroup——动画组
    动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行
    属性说明:
    –animations:用来保存一组动画对象的NSArray
    默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间
     
    具体的实例如下:
    实现功能:在创建的动画组中存入两个基本动画,一个是沿着Z轴旋转360度的动画,另一个是放大2倍的动画,这两个动画并发执行,动画结束后,均不在恢复原状。
    代码如下:
    //声明属性
    #import "ViewController.h"
    
    @interface ViewController ()
    @property (strong,nonatomic)CALayer *subLayer; //声明核心动画子层
    @end
    //创建动画子层,同时创建触摸手势,添加的手势事件处理的是动画组
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //创建子层
        self.subLayer = [CALayer layer];
        self.subLayer.bounds = CGRectMake(100, 100, 100, 100);
        self.subLayer.position = CGPointMake(100, 100);
        self.subLayer.backgroundColor = [[UIColor redColor]CGColor];
        [self.view.layer addSublayer:self.subLayer];
        
        
        
        //添加触摸手势
        UITapGestureRecognizer  *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
        tap.numberOfTapsRequired = 1;
        tap.numberOfTouchesRequired = 1;
        [self.view addGestureRecognizer:tap];
    }
    //定义方法,返回一个用于旋转的基本动画
    #pragma mark 返回一个实现旋转的基本动画
    -(CABasicAnimation*)rotationAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)tovalue
    {
        //创建基本动画(用于旋转)
        CABasicAnimation *baseAnimation = [[CABasicAnimation alloc]init];
        
        //设置形变属性值为旋转属性值
        baseAnimation.keyPath = @"transform.rotation.z";
        
        //设置旋转初值
        baseAnimation.fromValue = @(fromValue);
        
        //设置旋转终值
        baseAnimation.toValue = @(tovalue);
        
        //设置旋转动画持续时间
        baseAnimation.duration = 1.0f;
        
        
        //设置动画旋转结束后不恢复原状
        baseAnimation.removedOnCompletion = NO;
        baseAnimation.fillMode = kCAFillModeForwards;
        
        return baseAnimation;
    }
    //定义方法,返回一个用于放缩的基本动画
    #pragma mark 返回一个实现放缩的基本动画
    -(CABasicAnimation*)scaleAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)tovalue
    {
        //创建基本动画(用于放缩)
        CABasicAnimation *animScale = [[CABasicAnimation alloc]init];
        
        //设置形变属性为放缩属性值
        animScale.keyPath = @"transform.scale";
        
        //设置放缩初值
        animScale.fromValue = @(fromValue);
        
        //设置放缩终值
        animScale.toValue = @(tovalue);
        
        //设置放缩动画持续时间
        animScale.duration = 1.0f;
        
        //设置动画放缩结束后不恢复原状
        animScale.removedOnCompletion = NO;
        animScale.fillMode = kCAFillModeForwards;
        
        return animScale;
    }
    //处理触摸手势的事件,创建动画组,并将上面返回的两个动画对象添加进去,然后并发的执行动画组
    #pragma mark -tap触摸事件
    -(void)tap:(UITapGestureRecognizer *)sender
    {
    
        //方式一:依次调用各个的动画,效果也是可以的
        //旋转360度
        //[self.subLayer addAnimation:[self rotationAnimationFromValue:-M_PI toValue:M_PI] forKey:@"baseAnimation"];
    //放大2倍 //[self.subLayer addAnimation:[self scaleAnimationFromValue:1.0 toValue:2.0] forKey:@"animScale"];
    //方式二:并发执行动画组中的所有动画
    //创建动画组 CAAnimationGroup *Group = [[CAAnimationGroup alloc]init]; //将各种动画对象加入数组中 NSArray *animations = @[[self rotationAnimationFromValue:-M_PI toValue:M_PI],[self scaleAnimationFromValue:1.0 toValue:2.0]]; //动画数组中的动画的属性受动画组的统一控制 Group.animations = animations; //设置动画组中所有动画的持续时间 Group.duration = 1.0; //设置动画组中所有动画运行结束后不恢复原状 Group.removedOnCompletion = NO; Group.fillMode = kCAFillModeForwards; //往子层中添加动画组 [self.subLayer addAnimation:Group forKey:@"Group"]; }
    演示结果如下:
    开始时:
                     
    某一时刻:(由于动画过程中截取的图,截图比较大一些)  
       
               
    结束时:
  • 相关阅读:
    【Flutter学习】页面布局之基础布局组件
    【Flutter学习】基本组件之AppBar顶部导航栏
    【Flutter学习】基本组件之BottomNavigationBar底部导航栏
    开发日记:JsonCSharpHelp
    会议抢订
    C# WinForm 技巧十: winfrom 全屏自适应屏幕分辨率
    阿里云 轻量应用服务器(LAMP) 使用日志记录
    常见模块设计--权限管理(auth)
    PHP获取项目所有控制器方法名称
    想要开发自己的PHP框架需要那些知识储备?
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4886576.html
Copyright © 2020-2023  润新知