显示动画,隐式动画、关键帧动画

来源:互联网 发布:美国失业率数据 编辑:程序博客网 时间:2024/05/01 00:26

概要

      一些简单的动画代理学习例子,包括显示、隐式、关键帧、关键帧路径四类动画。(感觉这个动画太复杂,学习简单的例子没继续了)


结果展示


流程概要

    见代码


主要代码

////  ViewController.m//  Animation////  Created by arbboter on 14/12/20.//  Copyright (c) 2014年 arbboter. All rights reserved.//#import "ViewController.h"@interface ViewController ()@property (nonatomic, retain) UIImageView* head;@property (nonatomic, retain) UIButton* implicitAnimation;@property (nonatomic, retain) UIButton* explicitAnimation;@property (nonatomic, retain) UIButton* keyFrameAnimation;@property (nonatomic, retain) UIButton* resetHeatState;@end@implementation ViewController- (void)resetHead{    [_head removeFromSuperview];    [_head release];    _head = nil;        _head = [[UIImageView alloc] init];    _head.image = [UIImage imageNamed:@"head.png"];    _head.contentMode = UIViewContentModeScaleAspectFit;    [self.view addSubview:_head];        /** 设置初始值小且半透明 */    _head.frame = CGRectMake(10, 20, _head.image.size.width, _head.image.size.height);    _head.transform = CGAffineTransformMakeScale(0.1, 0.1);    _head.center = CGPointMake(self.view.center.x, _head.frame.size.height/2+20);    _head.alpha = 0.03;}- (void)viewDidLoad{    [super viewDidLoad];        [self resetHead];        UIButton* btn = nil;    /** 重置按钮 */    btn = [[UIButton alloc] initWithFrame:CGRectMake(10, self.view.frame.size.height-40, 80, 30)];    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];    [btn setTitle:@"重置动画" forState:UIControlStateNormal];    btn.layer.borderWidth = 1;    btn.layer.cornerRadius = 10;    [btn addTarget:self action:@selector(onAnimate:) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:btn];    _resetHeatState = btn;        /** 隐式动画按钮 */    btn = [[UIButton alloc] initWithFrame:CGRectMake(_resetHeatState.frame.origin.x + _resetHeatState.frame.size.width + 10, self.view.frame.size.height-40, 80, 30)];    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];    [btn setTitle:@"隐式动画" forState:UIControlStateNormal];    btn.layer.borderWidth = 1;    btn.layer.cornerRadius = 10;    [btn addTarget:self action:@selector(onAnimate:) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:btn];    _implicitAnimation = btn;        /** 显示动画按钮 */    btn = [[UIButton alloc] initWithFrame:CGRectMake(_implicitAnimation.frame.origin.x + _implicitAnimation.frame.size.width + 10, self.view.frame.size.height-40, 80, 30)];    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];    [btn setTitle:@"显示动画" forState:UIControlStateNormal];    btn.layer.borderWidth = 1;    btn.layer.cornerRadius = 10;    [btn addTarget:self action:@selector(onAnimate:) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:btn];    _explicitAnimation = btn;        /** 关键帧动画按钮 */    btn = [[UIButton alloc] initWithFrame:CGRectMake(_explicitAnimation.frame.origin.x + _explicitAnimation.frame.size.width + 10, self.view.frame.size.height-40, 80, 30)];    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];    [btn setTitle:@"关键帧" forState:UIControlStateNormal];    btn.layer.borderWidth = 1;    btn.layer.cornerRadius = 10;    [btn addTarget:self action:@selector(onAnimate:) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:btn];    _keyFrameAnimation = btn;}-(void)onAnimate:(id)sender{    CGPoint headCenter = _head.center;    CGPoint viewCenter = self.view.center;    if (sender == _implicitAnimation)    {        /** 隐式动画 */        [UIView beginAnimations:nil context:NULL];        _head.layer.affineTransform = CGAffineTransformMakeTranslation(0, viewCenter.y*3/2-headCenter.y);        _head.layer.affineTransform = CGAffineTransformScale(_head.layer.affineTransform, 1, 1);        _head.layer.opacity = 1;        [UIView commitAnimations];    }    else if(sender == _explicitAnimation)    {        /** 显示动画 */                /** 添加第一个动画【由透明渐变为清晰】 使用内置动画效果:opacity */        CABasicAnimation *opAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];        opAnim.duration = 5.0;        opAnim.fromValue = [NSNumber numberWithFloat:0.1];        opAnim.toValue= [NSNumber numberWithFloat:1.0];        //opAnim.cumulative = YES;        opAnim.repeatCount = 1;        [_head.layer addAnimation:opAnim forKey:@"animateOpacity"];                /** 添加第二个动画 平移而且变大 使用内置动画效果:transform */        CGAffineTransform t = CGAffineTransformMakeTranslation(0, viewCenter.y*3/2-headCenter.y);        t = CGAffineTransformScale(t, 1.5, 1.5);        CABasicAnimation *animatation = [CABasicAnimation animationWithKeyPath:@"transform"];        animatation.duration = opAnim.duration;        animatation.toValue= [NSValue valueWithCATransform3D:                           CATransform3DMakeAffineTransform(t)];        [_head.layer addAnimation:animatation forKey:@"animateTransform"];    }    else if(sender == _keyFrameAnimation)    {        /** 关键帧动画 */                if(arc4random()%2)        {            CAKeyframeAnimation *opAnim = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];            opAnim.duration = 6.0;            opAnim.values =[NSArray arrayWithObjects:                            [NSNumber numberWithFloat:0.0],                            [NSNumber numberWithFloat:0.1],                            [NSNumber numberWithFloat:0.3],                            [NSNumber numberWithFloat:1.0],                            nil];            opAnim.keyTimes = [ NSArray arrayWithObjects:                               [NSNumber numberWithFloat:0.0],                               [NSNumber numberWithFloat:0.3],                               [NSNumber numberWithFloat:0.6],                               [NSNumber numberWithFloat:1.0],                               nil];                        [_head.layer addAnimation:opAnim forKey:@"keyAnimateOpacity"];                        CGAffineTransform t = CGAffineTransformMakeTranslation(0, viewCenter.y*3/2-headCenter.y);            t = CGAffineTransformScale(t, 1.5, 1.5);            CABasicAnimation *animatation = [CABasicAnimation animationWithKeyPath:@"transform"];            animatation.duration = opAnim.duration;            animatation.toValue= [NSValue valueWithCATransform3D:                                  CATransform3DMakeAffineTransform(t)];            [_head.layer addAnimation:animatation forKey:@"keyAnimateTransform"];        }        else        {            _head.alpha = 1.0;            /** 关键帧之路径动画 */            NSInteger x = self.view.frame.size.width;            NSInteger y = self.view.frame.size.height;            int n = 4;            CGMutablePathRef path = CGPathCreateMutable();                        CGPathMoveToPoint(path, NULL, headCenter.x, headCenter.y);            for (int i=0; i<n; i++)            {                CGPathAddLineToPoint(path, NULL, 0, arc4random()%y);                CGPathAddLineToPoint(path, NULL, x, arc4random()%y);            }            CGPathCloseSubpath(path);                        CAKeyframeAnimation *animation = nil;            animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];            [animation setDuration:n*5];            [animation setDelegate:self];            [animation setPath:path];            CFRelease(path);            path = nil;            [[_head layer] addAnimation:animation forKey:@"position"];        }    }    else if(sender == _resetHeatState)    {        [self resetHead];    }}- (void)dealloc{    [_head release];    [_implicitAnimation release];    [_explicitAnimation release];    [_resetHeatState release];    [super dealloc];}@end


项目工程

0 0
原创粉丝点击