iOS:核心动画之关键帧动画CAKeyframeAnimation
#import "ViewController.h"
@interface ViewController ()
@property (strong,nonatomic)CALayer *subLayer; //声明核心动画子层
@end
- (void)viewDidLoad {
[super viewDidLoad];
//创建子层
self.subLayer = [CALayer layer];
//设置子层大小
self.subLayer.bounds = CGRectMake(, , , );
//设置子层的位置
self.subLayer.position = CGPointMake(, );
//设置子层的背景颜色
self.subLayer.backgroundColor = [[UIColor redColor]CGColor];
//添加子层到根层
[self.view.layer addSublayer:self.subLayer];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//创建关键帧动画
CAKeyframeAnimation *keyframe = [[CAKeyframeAnimation alloc]init];
//设置变化属性值为透明度
keyframe.keyPath = @"opacity"; //设置每一帧动画的透明度时刻值
keyframe.values = @[@1.0,@0.5,@0.0,@0.5,@1.0];
//设置动画持续事件
keyframe.duration = 1.0f;
//添加动画到子层
[self.subLayer addAnimation:keyframe forKey:@"keyAnimation"]; //forkey:的参数可以自己设置,就是一个标示符,区别开其他的动画
}



#import "ViewController.h"
#define MAX_CLICKED_NUM 4 //触摸的最大次数
@interface ViewController ()
@property (strong,nonatomic)NSMutableArray *points; //用于存放触摸屏幕的次数
@property (strong,nonatomic)CALayer *subLayer;//声明核心动画子层
@end
- (void)viewDidLoad {
[super viewDidLoad];
//初始化
self.points = [NSMutableArray array];
//创建子层
self.subLayer = [CALayer layer];
self.subLayer.bounds = CGRectMake(, , , );
self.subLayer.position = CGPointMake(, );
self.subLayer.backgroundColor = [[UIColor redColor]CGColor];
//添加子层到根层
[self.view.layer addSublayer:self.subLayer];
}
//触摸事件的处理
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//获取当前触摸点
CGPoint location = [[touches anyObject]locationInView:self.view]; //判断当前的点的个数
if (self.points.count < MAX_CLICKED_NUM)
{
//添加当前点
[self.points addObject:[NSValue valueWithCGPoint:location]];
}
else
{ //创建关键帧动画
CAKeyframeAnimation *keyanimation = [[CAKeyframeAnimation alloc]init]; //设置该变量为位置position
keyanimation.keyPath = @"position"; //设置每一帧动画的位置值
keyanimation.values = self.points; //设置动画持续时间
keyanimation.duration = 3.0f; //设置动画不在恢复原状
keyanimation.removedOnCompletion = NO;
keyanimation.fillMode = kCAFillModeForwards; //设置代理
keyanimation.delegate = self; //添加动画到层
[self.subLayer addAnimation:keyanimation forKey:@"keyanimation"];
} }
#pragma mark -动画代理方法
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
//关闭隐式动画
[CATransaction begin];
[CATransaction setDisableActions:YES]; //停留在最后的位置
self.subLayer.position = [[self.points lastObject]CGPointValue]; //提交动画事物
[CATransaction commit]; //删除上一次动画结束后保存的所有的数据
[self.points removeAllObjects];
}

#import "ViewController.h" @interface ViewController ()
@property (strong,nonatomic)CALayer *subLayer; //声明核心动画子层用作动画层
@property (assign,nonatomic)CGMutablePathRef path; //声明可变的绘图路径
@property (strong,nonatomic)CALayer *DrawLayer; //声明核心动画子层用来绘图层
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad]; //创建绘图子层
self.DrawLayer = [CALayer layer];
self.DrawLayer.bounds = self.view.bounds;
self.DrawLayer.position = CGPointMake(, );
self.DrawLayer.anchorPoint = CGPointMake(, );
self.DrawLayer.backgroundColor = [[UIColor whiteColor]CGColor]; //设置绘图子层的代理,它会调用协议中的绘图方法
self.DrawLayer.delegate = self; //添加绘图子层
[self.view.layer addSublayer:self.DrawLayer]; //创建动画子层
self.subLayer = [CALayer layer];
self.subLayer.bounds = CGRectMake(, , , );
self.subLayer.position = CGPointMake(, );
self.subLayer.backgroundColor = [[UIColor redColor]CGColor]; //添加动画子层
[self.view.layer addSublayer:self.subLayer];
}
//触摸点击事件的处理
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//获取当前触摸点
CGPoint location = [[touches anyObject]locationInView:self.view]; //创建路经
self.path = CGPathCreateMutable(); //将当前点加到路径中去
CGPathMoveToPoint(self.path, NULL, location.x, location.y); }
//触摸移动事件的处理
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//获取当前触摸点
CGPoint location = [[touches anyObject]locationInView:self.view]; //将当前点加到路径中去
CGPathAddLineToPoint(self.path, NULL, location.x, location.y); //让绘图子层绘图
[self.DrawLayer setNeedsDisplay];
}
//触摸结束事件的处理
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{ //创建帧动画
CAKeyframeAnimation *keyAnimation = [[CAKeyframeAnimation alloc]init]; //设置改变属性值为位置position
keyAnimation.keyPath = @"position"; //设置动画路径为绘制的路径
keyAnimation.path = self.path; //设置动画持续时间
keyAnimation.duration = 3.0f; //设置动画结束时保持不变,不在恢复原状
keyAnimation.removedOnCompletion = NO;
keyAnimation.fillMode = kCAFillModeForwards; //设置帧动画代理
keyAnimation.delegate = self; //添加帧动画到动画子层
[self.subLayer addAnimation:keyAnimation forKey:@"keyAnimation"];
}
#pragma mark -动画代理方法
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
//释放路径
CGPathRelease(self.path);
}
#pragma mark -UILayer画图方法
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
//添加路径
CGContextAddPath(ctx, self.path); //设置颜色
CGContextSetStrokeColorWithColor(ctx, [[UIColor blueColor]CGColor]); //绘路径
CGContextDrawPath(ctx, kCGPathStroke);
}
运行结果如下:只给出起始位置和结束位置截图,动画过程不好捕捉,就不给出截图了
开始时位置: 绘制路径后,动画沿路径运行结束位置:

iOS:核心动画之关键帧动画CAKeyframeAnimation的更多相关文章
- 核心动画基础动画(CABasicAnimation)关键帧动画
1.在iOS中核心动画分为几类: 基础动画(CABasicAnimation) 关键帧动画(CAKeyframeAnimation) 动画组(CAAnimationGroup) 转场动画(CATran ...
- ios基础动画、关键帧动画、动画组、转场动画等
概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...
- html5--6-55 动画效果-关键帧动画
html5--6-55 动画效果-关键帧动画 实例 @charset="UTF-8"; div{ width: 150px; height: 150px; font-size: 2 ...
- IOS开发-属性动画和关键帧动画的使用
CAMediaTiming是一个协议(protocol),CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类. 继承关系: CoreAnmiation 核心动画 简写CA ...
- WPF动画之关键帧动画(2)
XAML代码: <Window x:Class="关键帧动画.MainWindow" xmlns="http://schemas.microsoft.com/win ...
- 11.css3动画--自定义关键帧动画--@keyframes/animation
@keyframes设定动画规则,可以理解为动画的剧本. Name.自定义一个动画名称. 0-100%/from...to.... 需要变化的css样式属性. animation所有动画属性的简写.( ...
- iOS开发UI篇—核心动画(关键帧动画)
转自:http://www.cnblogs.com/wendingding/p/3801330.html iOS开发UI篇—核心动画(关键帧动画) 一.简单介绍 是CApropertyAnimatio ...
- IOS 动画专题 --iOS核心动画
iOS开发系列--让你的应用“动”起来 --iOS核心动画 概览 通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看 ...
- iOS 核心动画 Core Animation浅谈
代码地址如下:http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVie ...
随机推荐
- JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作
1.定义实体类,代码如下: (1).学生实体类: package learn.jpa.entity; import java.util.HashSet; import java.util.Set; i ...
- linux设备驱动第五篇:驱动中的并发与竟态
综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争. 首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时.并行被 ...
- PHP数组的定义和遍历
//常用函数//生成随机数//echo rand(3,33); //两个参数来确定随机数的范围为3-33 //日期时间函数echo time(); //取当前时间的UNIX时间戳//date_defa ...
- 使用HTML5中的element.dataset操作自定义data-*数据
不久之前我向大家展示了非常有用的classList API,它是一种HTML5里提供的原生的对页面元素的CSS类进行增.删改的接口,完全可以替代jQuery里的那些CSS类操作方法.而另外一个非常有用 ...
- BZOJ2457 BeiJing2011 双端队列
[问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...
- NYOJ-73 比大小 AC 分类: NYOJ 2014-01-17 21:29 195人阅读 评论(0) 收藏
典型的大数题目,这只是大数的比较,到时还有大数加减乘除,更加还有乘方,对于大数,一般用数组或者字符串,因为其他的结构类型一般都没有那么大 的范围!! 这道题目需要你仔细回想怎么比较俩个数字的大小,考虑 ...
- nsight 初级使用指南
1.安装,没有什么特殊设置 2.打开vs,编译生成你需要分析的.exe,在vs上方菜单,有nsight menu, choose Start Graphics Debugging. 3.在弹出对话框中 ...
- java如何操作注册表(Preferences类)(在windows的注册表中保存、读取)
我们经常需要将我们的程序运行中的一些信息(比如在选项对话框中的设置)记录下来,以做便再次运行的时候不用再重写填写这些数据.这对改善软件的人机可用性方面是很有用的.比如:数据库监控.日志工具,JDBMo ...
- Windows7 64位安装配置Apache2.4+PHP5.4+MySQL5.5+Xdebug
PHP更新已经到了5.4.7了,之前是用PHPstudy安装的PHP5.2.13版本,今天有空,就把之前的集成安装卸载了.换上了新一代PHP,记录一下.. 环境:Windows7 64位(内部版本76 ...
- iOS Automation Test
google resource for KIF: http://www.oschina.net/translate/ios-ui-testing-with-kif