iOS:quartz2D绘图 (动画)
quartz2D可以用来绘制自己需要的图形,它们绘制出来的是一个静态的图形,那么如何绘制一个动态的图形呢?动态的图形就是动画,所谓动画,其实就是很多张图片在短时间内不停的切换所产生的一种视觉效果。quartz2D可以绘制图形,想一想,那么如果我们设置一个定时器,在很短的时间内不停的绘制多张图片,这不就是动画效果吗?好了,思路已有,接下来就是实践了。
代码之前的一些准备:首先需要一份连续的图片素材,接着自定义一个视图类,并将控制器中的视图与它关联在一起。
我准备的素材是一个游戏的英雄人物,它有站着、攻击(招式有三种)、奔跑的几种状态,导入的素材文件为hero
下面开始代码的实现了:
1、在ViewController.m文件中初始化自定义的视图,即设置视图大小,并添加一个英雄图片
- (void)viewDidLoad {
[super viewDidLoad]; //添加英雄视图
HeroView *heroView = [[HeroView alloc]initWithFrame:self.view.bounds]; [self.view addSubview:heroView];
}
2、现在余下所有的代码都是自定义类ViewDemo.m文件中进行的,即
//枚举所有的英雄状态
typedef enum{
Hero_Stand,
Hero_Run,
Hero_Attack,
Hero_AttackJ,
Hero_AttackT
}HeroState;
//声明属性
@interface HeroView()
@property (strong,nonatomic)NSTimer *timer;
@property (assign,nonatomic)NSInteger index;
@property (assign,nonatomic)HeroState state;
@property (assign,nonatomic)CGPoint point;
@end
//初始化视图
-(instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
//初始化一个开始索引
_index = ; //初始化一个英雄状态
_state = Hero_Stand; //定时器
_timer = [NSTimer scheduledTimerWithTimeInterval:0.3f target:self selector:@selector(updateIndex) userInfo:nil repeats:YES]; self.backgroundColor = [UIColor whiteColor];
}
return self;
}
//不使用时停止定时器
-(void)dealloc
{
//停止定时器
if (_timer)
{
[_timer invalidate];
}
}
//定时器刷新方法
-(void)updateIndex
{
//更新图片额索引
NSInteger maxIndex = ;
switch (_state)
{
case Hero_Stand:
maxIndex = ;
break; case Hero_Run:
maxIndex = ;
break; case Hero_Attack:
maxIndex = ;
break; case Hero_AttackJ:
maxIndex = ;
break; case Hero_AttackT:
maxIndex = ;
break;
} //如果没有到最后一张图片,就累加
if (_index < maxIndex)
{
_index++;
}
//换成首张图片
else
{
_index = ;
} //让视图重绘
[self setNeedsDisplay];
}
//重写drawRect方法,根据英雄状态和索引绘制相应的图片
- (void)drawRect:(CGRect)rect
{
//画不同状态下的英雄
UIImage *image;
switch (_state)
{
case Hero_Stand:
image = [UIImage imageNamed:[NSString stringWithFormat:@"Hero%ld.png",_index]];
break; case Hero_Run:
image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroRun%ld.png",_index]];
break; case Hero_Attack:
image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroAttack%ld.png",_index]];
break; case Hero_AttackJ:
image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroAttackJ%ld.png",_index]];
break; case Hero_AttackT:
image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroAttackT%ld.png",_index]];
break;
} //一张张绘制不同状态的所有图片
[image drawAtPoint:self.point];
}
//触摸开始时的事件,每次点击就会切换英雄的状态
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//切换状态
if (_state < Hero_AttackT)
{
_state ++;
}
else
{
_state = Hero_Stand;
}
_index = ;
}
//触摸移动事件,可以手动移动英雄的位置
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{ //计算移动的位置
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self];
CGPoint preLocation = [touch previousLocationInView:self];
CGFloat xOffset = location.x - preLocation.x;
CGFloat yOffset = location.y - preLocation.y;
_point = CGPointMake(_point.x+xOffset, _point.y+yOffset); //让视图重绘
[self setNeedsDisplay];
}
好了所有的代码都已写完,下面就是演示了,由于无法插入视频,就给出截图了。
站着时绘制的英雄动画:
攻击时绘制的英雄动画:三种攻击方式
奔跑时绘制的英雄动画:
移动英雄的位置到中间:
iOS:quartz2D绘图 (动画)的更多相关文章
- iOS:quartz2D绘图
Quartz-2D:绘图 一.介绍: •Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境 •Quartz 2D API可以实现许多功能,如基于路径的绘图.透明度.阴影 ...
- 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO
知识点复习 1. 触摸事件&手势识别 1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加) 附加在某一个特定视图上的, ...
- iOS 视图,动画渲染机制探究
腾讯Bugly特约作者:陈向文 终端的开发,首当其冲的就是视图.动画的渲染,切换等等.用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅.UI就是 App 的门面,它的体验 ...
- iOS关于CoreAnimation动画知识总结
一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了: ...
- IOS中的动画菜单
SvpplyTable(可折叠可张开的菜单动画) 允许你简单地创建可折叠可张开的菜单动画效果,灵感来自于Svpply app.不同表格项目使用JSON定义,你可以定义每个菜单项和任何子菜单,为每个项目 ...
- 转 iOS Core Animation 动画 入门学习(一)基础
iOS Core Animation 动画 入门学习(一)基础 reference:https://developer.apple.com/library/ios/documentation/Coco ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- iOS中的动画
iOS中的动画 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .fr ...
- IOS UIVIEW layer动画 总结(转)
转发自:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/16306_12.html IOS UIVIEW layer动画 总结, ...
随机推荐
- thinkphp5 消息队列thinkphp-queue扩展
1.简介 thinkphp-queue是thinkphp的一个第三方扩展, 内置了 Redis,Database,Topthink ,Sync这四种驱动,推荐使用redis 2. 下载 和安装 com ...
- MiCode 40: 找小“3”
题目链接 这道题真的是zjb恶心, 看其起来像是个数位dp, 然而我并不会数位dp.然后就xjb乱写了个雷类似于动态规划的玩意, 然后调出了\(9\times 9 = 81\)种Bug, 终于过了. ...
- hdu 2686&&hdu 3376(拆点+构图+最小费用最大流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 通过javascript进行UTF-8编码
通过javascript进行UTF-8编码 javascript的字符集: javascript程序是使用Unicode字符集编写的.Unicode是ASCII和Latin-1的超集,并支持地球上几乎 ...
- Excel Application对象应用
Application对象是Excel对象模型中最高层级的对象,代表Excel应用程序自身,也包含组成工作簿的许多部分,包括工作簿.工作表.单元格集合以及它们包含的数据. Application对象包 ...
- 初见Python<1>:基础语法
1.两个整数相除,计算结果的小数部分被截除,结果仍然是一个整数: 如:1/2=0 2.整数和浮点数相除.或者浮点数之间相除,结果有小数部分,仍然是一个浮点数: 如:1/2.0=0.5 1.0/2=0 ...
- luogu P1060 开心的金明
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今天 ...
- Codeforces 285 E. Positions in Permutations
\(>Codeforces \space 285 E. Positions in Permutations<\) 题目大意 : 定义一个长度为 \(n\) 的排列中第 \(i\) 个元素是 ...
- [BZOJ5011][JXOI2017]颜色
5011: [Jx2017]颜色 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 84 Solved: 46[Submit][Status][Disc ...
- 【斜率优化】bzoj3675-[Apio2014]序列分割&&Uoj104
题目大意 将一个长度为N的非负整数序列分割成k+l个非空的子序列,每次选择一位置分割后,将会得到一定的分数,这个分数为两个新序列中元素和的乘积.求最大的分数. [UOJ104]并输出任意一种方案 思路 ...