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 ...
随机推荐
- Android下写一个永远不会被KILL掉的进程/服务
Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用.当系统觉得当前的资源非常有限的时候,为了保证一些优先级高的程序能运行,就会杀掉一些 ...
- spring字符编码设置
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springf ...
- Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)
1.非集成Spring hibernate的检索方式,主要有以下五种. 1.导航对象图检索方式.(根据已经加载的对象,导航到其他对象.) 2.OID检索方式.(按照对象的OID来检索对象.) 3.HQ ...
- Analyzer使用第二Y轴,以及同一分析图不同量值使用不同的图形样式
Analyzer的建立分析图后,图中有两个量值,希望能显示成不同的图形样式,如一个是柱图.一个是线图. 1.设置显示多个量值: 3.设置显示出图例,即表明图中量值内容的说明: 2.右键图例中要修改为不 ...
- 【Flatten Binary Tree to Linked List】cpp
题目: Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 ...
- C Shell 中的特殊变量
恢复 $0,当前脚本的文件名 $n,传递给脚本或函数的参数,n是一个数字,表示第几个参数 $#,传递给脚本或函数的参数个数 $*,传递给脚本或函数的所有参数 $?,函数的返回值 $$,当前shell的 ...
- 1.项目开发-->Memcached之ASP.NET实现
1.Memcached安装 第一步:下载windows稳定版Memcached 1.2.1 win32,解压后,将memcached.exe文件放到自己想存放的盘符内,例如C:\Windows\Sys ...
- Maven搭建webService (三) 创建客户端---使用Apache CXF方式实现
package test; import net.cc.web.server.HelloWorld; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean ...
- 【BZOJ】【3156】防御准备
DP/斜率优化 斜率优化的裸题…… sigh……又把$10^6$当成10W了……RE了N发 这题还是很水的 当然逆序也能做……不过还是整个反过来比较顺手 反转后的a[0]=反转前的a[n],以此类推直 ...
- mysql导出导入某张表
一般表数据少的话都用图形界面了,看着比较方便. 如果表中数据比较多,用图形界面极容易卡死,这个时候就要用到命令行了. 用命令行导出导入大量数据还是比较快的,方法如下: 导出库db1中的表table1: ...