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

概要

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


结果展示


流程概要

    见代码


主要代码

//
//  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


项目工程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值