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 selector
android 选择器的使用 1.在drawable文件夹下面建一个xml文件,如item.xml,在eclipse中有selector这个选项 2.可以在布局文件.xml(配置android:lis ...
- IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
... 首先了解一下CGContextRef: An opaque type that represents a Quartz 2D drawing environment. Graphics Con ...
- Netsharp快速入门(之5) 基础档案(之D 实体建模 生成实体代码、同步数据库、配置插件运行时)
作者:秋时 杨昶 时间:2014-02-15 转载须说明出处 3.3.1 同步数据库并生成dll文件 1.在基础档案和销售管理项目上右击,选择同步数据库结构来创建数据库表 2. 在基础档案项目 ...
- 【LCA】CodeForce #326 Div.2 E:Duff in the Army
C. Duff in the Army Recently Duff has been a soldier in the army. Malek is her commander. Their coun ...
- 管理员必须掌握的八个cmd命令
一.ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的 ...
- websphere变成英文了
ebsphere页面怎么变成中文? 浏览器 -- internet选项 -- 常规 -- "语言" -- 打开后: 1. 如果只有"英语(美国)[en-US]" ...
- Struct2、Hibernate3、Spring3框架搭建实战(转)
采用目前最新的struts-2.3.1.2.hibernate3.6.10.Final.spring-framework-3.1.1.RELEASE开发包,以及eclipse-jee-indigo-S ...
- BZOJ 1088
真是智商不够, 智商题:.... 假如:第1,2个格子已知,然后根据第二列的情况,就可以把所有满足的情况推出来,又萌萌哒.. 无耻攒字数: #include<stdio.h> using ...
- samsung-smart app 开发
http://www.samsungdforum.com/ http://seller.samsungapps.com/login/signIn.as?returnURL=%2fmain%2fsell ...
- MEAN实践——LAMP的新时代替代方案(上)
摘要:90 年代,LAMP 曾风靡一时,然而随着需求的变迁和数据流量的激增,LAMP 已不可避免的走下神坛.近日,在 MongoDB Blog 中,Dana Groce 介绍了一个基于新时代架构的实践 ...