帧动画与定时器动画的火焰效果

首先是使用定时器制作的火焰动画效果

 1 #import "FireViewController.h"
 2 
 3 @implementation FireViewController
 4 
 5 - (void)viewDidLoad
 6 {
 7     [super viewDidLoad];
 8     
 9     _fireImageView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
10     [self.view addSubview:_fireImageView];
11     _imageNameArray = [[NSMutableArray alloc] init];  //使用可变数组
12     for (int i = 1; i <= 17; i++)
13     {
14         NSString * imageName = [NSString stringWithFormat:@"Fire%d.gif", i];
15         [_imageNameArray addObject:imageName];
16     }
17     
18     _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fireShow) userInfo:nil repeats:YES];   //定时器
19     
20     UIButton *kaiGuan = [UIButton buttonWithType:UIButtonTypeSystem];
21     kaiGuan.frame = CGRectMake(280, 20, 30, 30);
22     [kaiGuan setBackgroundImage:[UIImage imageNamed:@"inc_pause.png"] forState:UIControlStateNormal];
23     kaiGuan.tag = 99;
24     [kaiGuan addTarget:self action:@selector(isContinue) forControlEvents:UIControlEventTouchUpInside];
25     [self.view addSubview:kaiGuan];
26 }
27 
28 - (void)fireShow
29 {
30     static int count = 0;
31     
32     _fireImageView.image = [UIImage imageNamed:[_imageNameArray objectAtIndex:count]];
33     count ++;
34     
35     if (count >= _imageNameArray.count)
36     {
37         count = 0;
38     }
39 }
40 
41 - (void)isContinue
42 {
43     UIButton * btn = (UIButton *)[self.view viewWithTag:99];
44     if ( _timer != nil )  //[_timer isValid] 判断定时器是都还有效
45     {
46         [_timer invalidate];  //销毁动画
47         [btn setBackgroundImage:[UIImage imageNamed:@"inc_start.png"] forState:UIControlStateNormal];   //更换按钮的显示图片
48         _timer = nil;
49         
50     }
51     else
52     {
53         _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fireShow) userInfo:nil repeats:YES];  //重新生成一个定时器
54         [btn setBackgroundImage:[UIImage imageNamed:@"inc_pause.png"] forState:UIControlStateNormal];
55     }
56 }
57 
58 @end
View Code

下面这一段是使用帧动画实现的火焰效果图

 1 #import "HUAppDelegate.h"
 2 
 3 @implementation HUAppDelegate
 4 
 5 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 6 {
 7     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
 8     // Override point for customization after application launch.
 9     self.window.backgroundColor = [UIColor whiteColor];
10     [self.window makeKeyAndVisible];
11     
12     //创建可变数组,存放图片
13     NSMutableArray *imageArray = [[NSMutableArray alloc] init];
14     for (int i=1; i < 18; i ++ )
15     {
16         [imageArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"Fire%d.gif", i]]];
17     }
18     
19     UIImageView *imageView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
20 //    imageView.image = [UIImage imageNamed:@"Fire1.gif"];  //这句不可少,否则点击按钮让动画暂停的时候,出现白屏,因为此时没有图片被加载
21     imageView.tag = 22; //设置 tag 的原因是避免设置全局变量
22     
23     //帧动画
24     imageView.animationImages = imageArray;   //数组里存储的必须是 UIImage 的对象,即图片
25     [imageView setAnimationDuration:2];   //用来这只动画持续的时间
26     [imageView setAnimationRepeatCount:0];  //0 表示无限多次,与 UIView 里的setAnimationRepeatCount:(float)repeatCount 0(默认为不重复) 不同
27     [imageView startAnimating];  //动画开始
28     [self.window addSubview:imageView];
29 
30     //使用全屏的按钮,可以实现点击屏幕让火焰停止与继续
31     UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
32     btn.frame = [UIScreen mainScreen].bounds;
33     [self.window addSubview:btn];
34     [btn addTarget:self action:@selector(pauseOrContinue) forControlEvents:UIControlEventTouchUpInside];
35     
36     return YES;
37 }
38 
39 - (void)pauseOrContinue
40 {
41     UIImageView *imageView = (UIImageView *)[self.window viewWithTag:22];
42 //    if ([imageView isAnimating])
43 //    {
44 //        [imageView stopAnimating];
45 //    }
46 //    
47 //    else
48 //    {
49 //        [imageView startAnimating];
50 //    }
51     
52     //还可以用另外一种方法来控制动画是否暂停与继续
53     static int count = 0;
54     count ++;
55     if (count % 2 == 1)
56     {
57         [imageView stopAnimating];
58     }
59     else
60     {
61         [imageView startAnimating];
62     }//这种方法更为通用一点,因为不是所有的控件都有判断其是否继续的 属性
63 }
64 
65 @end
View Code

使用者两种方法制作的火焰动画在视觉效果上并没有什么区别

        

区别在于点击按钮时:

使用定时器 NSTimer  生成的动画,点击按钮时图片停止在当前图片,即每次停止时显示的图片有可能都不一样,因为定时器切片时时根据当前图片的计数器来决定的。

使用帧动画生成的动画,在点击按钮让动画停止时,图片总是会回到第一张图片,所以如果不设置第一张图片的话,每次点击让动画停止会出现白屏。

 

posted @ 2014-12-17 19:42  红红de  阅读(415)  评论(0编辑  收藏  举报