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 ...
随机推荐
- 基于PBOC电子钱包的消费过程详解
智能卡金融行业应用电子钱包的消费交易流程,开发人员可参考 首先终端和卡片有一个共同的密钥叫做消费密钥:PurchKey (针对每种特定的交易,比如,圈存,消费,都有特定的密钥与之对应) 假设Purch ...
- 转载:SQL索引一步到位
原文: http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文 ...
- LNMP系列网站零基础开发记录(一)
[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配 ...
- 【Binary Tree Preorder Traversal】cpp
题目: Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binar ...
- timersmanager 解析
最近在看crtmp源代码,看到timersmanager 模块时感觉很难理解,花了不少时间反复思考该模块 的逻辑,现在思考的结果记录下来,方便以后查阅. 构造函数中将处理时间方法传进来,将_lastT ...
- PHP实现简单的学生信息管理系统(web版)
(∩_∩) 1.概述 学了php的一些基础,包括HTML,php,pdo,mysql操作等,一直都没有将它们有机结合.最近写了一个简单的网页版学生信息管理系统,前台用HTML,脚本用到了JavaScr ...
- Spring项目跟Axis2结合
本文的前提是已经有一个Spring的项目,在此基础上如何跟Axis2进行结合,开发出WebService服务和调用WebService服务. 1.开放WebService服务 1.引入必要的ja ...
- WC2016游记
出发的时候,长沙忽然就出了太阳,明媚而和煦. [day0 25] 噫吁嚱,危乎高哉!蜀道之难,难于上青天! 总之本来上午已经准备好9:50的飞机…然后就在一次次的手机查询中变成了5点多…然后也不是直飞 ...
- 【BZOJ】【1052】【HAOI2007】覆盖问题
二分+贪心 首先二分L,转化成判定问题…… 但是判定不会判啊QAQ orz hzwer,用一个最小的矩形框住所有点后,直接往矩形的角上摆正方形……第二个用同样的方法摆,最后判一下剩下的能否被完全覆盖 ...
- Basic knowledge of javaScript (keep for myself)
1. 函数表达式 JavaScript 函数可以通过一个表达式定义.eg. var x = function (a, b) {return a * b}; so: var x = function ( ...