zoukankan      html  css  js  c++  java
  • 帧动画与定时器动画的火焰效果

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

     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  生成的动画,点击按钮时图片停止在当前图片,即每次停止时显示的图片有可能都不一样,因为定时器切片时时根据当前图片的计数器来决定的。

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

  • 相关阅读:
    155. 最小栈
    160. 相交链表
    PAT 1057 Stack
    PAT 1026 Table Tennis
    PAT 1017 Queueing at Bank
    PAT 1014 Waiting in Line
    PAT 1029 Median
    PAT 1016 Phone Bills
    PAT 1010 Radix
    PAT 1122 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/hyhl23/p/4170212.html
Copyright © 2011-2022 走看看