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 = 1;
        
        //初始化一个英雄状态
        _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 = 1;
    switch (_state)
    {
        case Hero_Stand:
            maxIndex = 3;
            break;
            
        case Hero_Run:
            maxIndex = 11;
            break;
            
        case Hero_Attack:
            maxIndex = 5;
            break;
            
        case Hero_AttackJ:
            maxIndex = 8;
            break;
            
        case Hero_AttackT:
            maxIndex = 3;
            break;
    }
    
    //如果没有到最后一张图片,就累加
    if (_index < maxIndex)
    {
        _index++;
    }
    //换成首张图片
    else
    {
        _index = 1;
    }
    
    //让视图重绘
    [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 = 1;
}
复制代码

//触摸移动事件,可以手动移动英雄的位置

复制代码
-(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高级

本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4875411.html,如需转载请自行联系原作者
相关文章
|
5月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
120 1
|
6月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
108 5
|
7月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
123 11
|
8月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
97 7
|
11月前
|
iOS开发
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
168 0
|
编译器 iOS开发 异构计算
读iOS核心动画笔记
读iOS核心动画笔记
86 0
|
API iOS开发
iOS 自定义转场动画 UIViewControllerTransitioning
iOS 自定义转场动画 UIViewControllerTransitioning
178 0
|
iOS开发
iOS 动画绘制圆形
iOS 动画绘制圆形
121 1
|
iOS开发
iOS 常用阅读软件打开书籍的转场动画
iOS 常用阅读软件打开书籍的转场动画
131 0
|
API iOS开发
iOS 核心动画
iOS 核心动画
101 0