CAAnimation——基本动画,关键帧动画和贝塞尔路径
来源:互联网 发布:中山陵哭陵事件 知乎 编辑:程序博客网 时间:2024/05/20 23:04
概述
在做对于图层的动画效果时,往往直接改变属性或者使用隐式动画是不能满足我们的需求的,所以我们就用到了显式动画,CAAnimation。它可以管理重复动画、准确的控制时间和步调,并且能设定图层过渡。当然,所有隐式动画能做到的,显式动画也都能做到。
来看下CAAnimation的继承体系
CABasicAnimation
- (void)demoViewBasicAnimation{ CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(_demoView.center.x, _demoView.center.y)]; //可以省略... animation.toValue = [NSValue valueWithCGPoint:CGPointMake(270, 410)]; animation.duration = 3.0f; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; //动画速度设置 [_demoView.layer addAnimation:animation forKey:nil];}
编译运行,会发现动画在执行后demoView回到了起点,这里需要对动画的两个属性进行设置,让图层在完成动画后停留在动画后的状态。
...... animation.fillMode = kCAFillModeForwards; animation.removedOnCompletion = NO;......
加入这两行代码后就简单的完成了位移动画
注意这里填写的keyPath是一个NSString类型的字符串,这是系统封装好的键路径,2维常用的主要有 transform opacity position等。
在CAAnimation中可以实现代理方法
- animationDidStart:
- animationDidStop:finished:
分别对应刚启动时的状态和完成后的状态
在addAnimation:forKey:方法中,也可以给这个动画设置一个键,可以在其他地方将其取出来,进行一些操作,比如删除。这也充分体现了kvc的灵活。
用到CALayer的 removeAnimationForKey:方法。
CAKeyframeAnimation
如果是简单的动画CABasicAnimation就能完成,CAKeyframeAnimation(关键帧动画)弥补了基本动画只能传入一对对应值的不足,关键帧动画支持传入一套数值或一个路径来完成动画。
- (void)demoViewKeyframeAnimation{ _demoView.layer.anchorPoint = CGPointMake(0.5, 0.0); CAKeyframeAnimation *animaiton = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; NSArray *rotationVelues = @[@(M_PI_4), @(-M_PI_4), @(M_PI_4)]; animaiton.values = rotationVelues; animaiton.duration = 3.0f; animaiton.repeatCount = HUGE_VALF; // #define HUGE_VALF 1e50f [_demoView.layer addAnimation:animaiton forKey:nil];}
编译运行后可以发现demoView像一个钟摆一样不停摇晃,如果想效果更逼真,可以使用连续动画配合timingFunction来实现。
动画添加贝塞尔路径
- (void)demoViewBezierPathAnimation{ UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:_demoView.center]; //一定要设置 不然底层的CGPathRef找不到起始点,将会崩溃 [path addCurveToPoint:CGPointMake(270, 410) controlPoint1:CGPointMake(0, Screen_Height) controlPoint2:CGPointMake(Screen_Width, 0)]; //以左下角和右上角为控制点 CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; animation.path = path.CGPath; animation.duration = 3.0f; animation.removedOnCompletion = NO; animation.fillMode = kCAFillModeForwards; [_demoView.layer addAnimation:animation forKey:nil];}
设置了一个贝塞尔路径,赋给动画的路径属性,两个控制点为左下以及右上
Demo源码点击打开链接
以上为本篇博客全部内容,欢迎指正和交流。转载请注明出处~
- CAAnimation——基本动画,关键帧动画和贝塞尔路径
- Core Animation动画学习3——基本动画、关键帧动画、转场动画 和 动画组
- [CAAnimation核心动画练习二]关键帧动画,实现抖动
- UIView动画和CAAnimation动画
- IOS之CAAnimation基本动画
- iOS-利用UIBezierPath和CAAnimation制作路径动画
- CAAnimation动画/CAAnimation Group
- CAAnimation动画/CAAnimation Group
- CAAnimation动画/CAAnimation Group
- CAAnimation动画/CAAnimation Group
- CAAnimation动画/CAAnimation Group
- CAAnimation动画/CAAnimation Group
- 《核心动画——关键帧动画》
- CALayer层和CAAnimation动画
- 动画浅析-CAAnimation和CATransition
- 动画浅析-CAAnimation和CATransition
- 动画浅析-CAAnimation和CATransition
- 动画浅析-CAAnimation和CATransition
- 学习boost::program_option
- 明晰C++内存分配的五种方法的区别
- Oracle Listener 动态注册 与 静态注册
- 作为程序员,我想养成的几个爱好
- android应用推荐
- CAAnimation——基本动画,关键帧动画和贝塞尔路径
- sizeof进行结构体大小的判断 (包含位域),讲解详细
- JSP中forward和sendRedirect的区别
- Using KVO for Table Update
- EasySize - Dialog resizing in no time!
- 正则表达式
- 【机房系统知识小结点系列】之为什么不直接将属性设置为public,而是通过Get Set方法?
- php 访问mysql数据库验证登录
- 东软实训随笔