图片碎片化mask动画

图片碎片化mask动画

 

效果

 

源码

https://github.com/YouXianMing/Animations

//
//  TransformFadeViewController.m
//  Animations
//
//  Created by YouXianMing on 15/11/17.
//  Copyright  2015年 YouXianMing. All rights reserved.
//

#import "TransformFadeViewController.h"
#import "TranformFadeView.h"
#import "GCD.h"

typedef enum : NSUInteger {

    TYPE_ONE,
    TYPE_TWO,

} EType;

@interface TransformFadeViewController ()

@property (nonatomic, strong) TranformFadeView *tranformFadeViewOne;
@property (nonatomic, strong) TranformFadeView *tranformFadeViewTwo;

@property (nonatomic, strong) GCDTimer *timer;
@property (nonatomic)         EType     type;

@property (nonatomic, strong) NSArray   *images;
@property (nonatomic)         NSInteger  count;

@end

@implementation TransformFadeViewController

- (void)viewDidLoad {

    [super viewDidLoad];
}

- (void)setup {

    [super setup];

    self.images = @[[UIImage imageNamed:@"1"],
                    [UIImage imageNamed:@"2"],
                    [UIImage imageNamed:@"3"],
                    [UIImage imageNamed:@"4"],
                    [UIImage imageNamed:@"5"]];

    // 图片1
    self.tranformFadeViewOne                 = [[TranformFadeView alloc] initWithFrame:self.view.bounds];
    self.tranformFadeViewOne.contentMode     = UIViewContentModeScaleAspectFill;
    self.tranformFadeViewOne.image           = [self currentImage];
    self.tranformFadeViewOne.verticalCount   = 2;
    self.tranformFadeViewOne.horizontalCount = 12;
    self.tranformFadeViewOne.center          = self.view.center;
    [self.tranformFadeViewOne buildMaskView];

    self.tranformFadeViewOne.fadeDuradtion        = 1.f;
    self.tranformFadeViewOne.animationGapDuration = 0.1f;

    [self.view addSubview:self.tranformFadeViewOne];

    // 图片2
    self.tranformFadeViewTwo                 = [[TranformFadeView alloc] initWithFrame:self.view.bounds];
    self.tranformFadeViewTwo.contentMode     = UIViewContentModeScaleAspectFill;
    self.tranformFadeViewTwo.verticalCount   = 2;
    self.tranformFadeViewTwo.horizontalCount = 12;
    self.tranformFadeViewTwo.center          = self.view.center;
    [self.tranformFadeViewTwo buildMaskView];

    self.tranformFadeViewTwo.fadeDuradtion        = 1.f;
    self.tranformFadeViewTwo.animationGapDuration = 0.1f;

    [self.view addSubview:self.tranformFadeViewTwo];
    [self.tranformFadeViewTwo fadeAnimated:YES];

    // timer
    self.timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
    [self.timer event:^{

        if (self.type == TYPE_ONE) {

            self.type = TYPE_TWO;

            [self.view sendSubviewToBack:self.tranformFadeViewTwo];
            self.tranformFadeViewTwo.image = [self currentImage];
            [self.tranformFadeViewTwo showAnimated:NO];
            [self.tranformFadeViewOne fadeAnimated:YES];

        } else {

            self.type = TYPE_ONE;

            [self.view sendSubviewToBack:self.tranformFadeViewOne];
            self.tranformFadeViewOne.image = [self currentImage];
            [self.tranformFadeViewOne showAnimated:NO];
            [self.tranformFadeViewTwo fadeAnimated:YES];
        }

    } timeIntervalWithSecs:6];
    [self.timer start];
}

- (UIImage *)currentImage {

    self.count = ++self.count % self.images.count;

    return self.images[self.count];
}

@end
//
//  TranformFadeView.h
//  TransformationFadeView
//
//  Created by XianMingYou on 15/4/16.
//  Copyright (c) 2015年 XianMingYou. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface TranformFadeView : UIView

/**
 *  Image显示方式
 */
@property (nonatomic) UIViewContentMode  contentMode;

/**
 *  要显示的相片
 */
@property (nonatomic, strong) UIImage   *image;

/**
 *  垂直方向方块的个数
 */
@property (nonatomic) NSInteger          verticalCount;

/**
 *  水平的个数
 */
@property (nonatomic) NSInteger          horizontalCount;

/**
 *  开始构造出作为mask用的view
 */
- (void)buildMaskView;

/**
 *  渐变动画的时间
 */
@property (nonatomic) NSTimeInterval     fadeDuradtion;

/**
 *  两个动画之间的时间间隔
 */
@property (nonatomic) NSTimeInterval     animationGapDuration;

/**
 *  开始隐藏动画
 *
 *  @param animated 是否执行动画
 */
- (void)fadeAnimated:(BOOL)animated;

/**
 *  开始显示动画
 *
 *  @param animated 时候执行动画
 */
- (void)showAnimated:(BOOL)animated;

@end
//
//  TranformFadeView.m
//  TransformationFadeView
//
//  Created by XianMingYou on 15/4/16.
//  Copyright (c) 2015年 XianMingYou. All rights reserved.
//

#import "TranformFadeView.h"

#define  STATR_TAG  0x19871220

@interface TranformFadeView ()

/**
 *  图片
 */
@property (nonatomic, strong) UIImageView    *imageView;

/**
 *  所有的maskView
 */
@property (nonatomic, strong) UIView         *allMaskView;

/**
 *  maskView的个数
 */
@property (nonatomic)         NSInteger       maskViewCount;

/**
 *  存储maskView的编号
 */
@property (nonatomic, strong) NSMutableArray *countArray;

@end

@implementation TranformFadeView

/**
 *  初始化并添加图片
 *
 *  @param frame frame值
 */
- (void)initImageViewWithFrame:(CGRect)frame {

    self.imageView                     = [[UIImageView alloc] initWithFrame:frame];
    self.imageView.layer.masksToBounds = YES;
    [self addSubview:self.imageView];
}

- (instancetype)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]) {

        [self initImageViewWithFrame:self.bounds];
    }

    return self;
}

- (void)buildMaskView {

    // 如果没有,就返回空
    if (self.horizontalCount < 1 || self.verticalCount < 1) {

        return;
    }

    // 承载所有的maskView
    self.allMaskView = [[UIView alloc] initWithFrame:self.bounds];
    self.maskView    = self.allMaskView;

    // 计算出每个view的尺寸
    CGFloat height         = self.frame.size.height;
    CGFloat width          = self.frame.size.width;
    CGFloat maskViewHeight = self.verticalCount   <= 1 ? height : (height / self.verticalCount);
    CGFloat maskViewWidth  = self.horizontalCount <= 1 ? width  : (width  / self.horizontalCount);

    // 用以计数
    int count = 0;

    // 先水平循环,再垂直循环
    for (int horizontal = 0; horizontal < self.horizontalCount; horizontal++) {

        for (int vertical = 0; vertical < self.verticalCount; vertical++) {

            CGRect frame = CGRectMake(maskViewWidth  * horizontal,
                                      maskViewHeight * vertical,
                                      maskViewWidth,
                                      maskViewHeight);

            UIView *maskView         = [[UIView alloc] initWithFrame:frame];
            maskView.frame           = frame;
            maskView.tag             = STATR_TAG + count;
            maskView.backgroundColor = [UIColor blackColor];

            [self.allMaskView addSubview:maskView];

            count++;
        }
    }

    self.maskViewCount = count;

    // 存储
    self.countArray  = [NSMutableArray array];
    for (int i = 0; i < self.maskViewCount; i++) {

        [self.countArray addObject:@(i)];
    }
}

/**
 *  策略模式一
 *
 *  @param inputNumber 输入
 *
 *  @return 输出
 */
- (NSInteger)strategyNormal:(NSInteger)inputNumber {

    NSNumber *number = self.countArray[inputNumber];
    return number.integerValue;
}

- (void)fadeAnimated:(BOOL)animated {

    if (animated == YES) {

        for (int i = 0; i < self.maskViewCount; i++) {

            UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]];
            [UIView animateWithDuration:(self.fadeDuradtion <= 0.f ? 1.f : self.fadeDuradtion)
                                  delay:i * (self.animationGapDuration <= 0.f ? 0.2f : self.animationGapDuration)
                                options:UIViewAnimationOptionCurveLinear
                             animations:^{

                                 tmpView.alpha = 0.f;

                             } completion:^(BOOL finished) {

                             }];
        }

    } else {

        for (int i = 0; i < self.maskViewCount; i++) {

            UIView *tmpView = [self maskViewWithTag:i];
            tmpView.alpha   = 0.f;
        }
    }
}

- (void)showAnimated:(BOOL)animated {

    if (animated == YES) {

        for (int i = 0; i < self.maskViewCount; i++) {

            UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]];

            [UIView animateWithDuration:(self.fadeDuradtion <= 0.f ? 1.f : self.fadeDuradtion)
                                  delay:i * (self.animationGapDuration <= 0.f ? 0.2f : self.animationGapDuration)
                                options:UIViewAnimationOptionCurveLinear
                             animations:^{

                                 tmpView.alpha = 1.f;
                             } completion:^(BOOL finished) {

                             }];
        }

    } else {

        for (int i = 0; i < self.maskViewCount; i++) {

            UIView *tmpView = [self maskViewWithTag:i];
            tmpView.alpha   = 1.f;
        }
    }
}

/**
 *  根据tag值获取maskView
 *
 *  @param tag maskView的tag值
 *
 *  @return tag值对应的maskView
 */
- (UIView *)maskViewWithTag:(NSInteger)tag {

    return [self.maskView viewWithTag:tag + STATR_TAG];
}

#pragma mark - setter & getter.
@synthesize contentMode = _contentMode;
- (void)setContentMode:(UIViewContentMode)contentMode {

    _contentMode               = contentMode;
    self.imageView.contentMode = contentMode;
}

- (UIViewContentMode)contentMode {

    return _contentMode;
}

@synthesize image = _image;
- (void)setImage:(UIImage *)image {

    _image               = image;
    self.imageView.image = image;
}

- (UIImage *)image {

    return _image;
}

@end

细节

使用的时候动态切换图片就可以了,实际上只需要创建出2个view.

时间: 2024-08-31 02:26:53

图片碎片化mask动画的相关文章

IOS实现碎片化动画详解_IOS

碎片化效果图 遮罩视图 在UIView中有一个maskView属性,这个属性是我们今天实现动画的最重要的变量.这个属性在iOS8之后开始使用,用来表示视图的遮罩.什么是遮罩呢?我想了很久都没有找到合适的比喻来介绍这个.简单来说,一个UIView的对象,可以通过设置alpha来改变这个视图的透明度,遮罩的实现效果也是一样的.唯一的差别在于前者是通过修改0~1之间的值来改变透明效果,作为遮罩的视图对象的backgroundColor.alpha.transform等等属性都会影响到被遮盖的视图的透明

用 Core Animation 实现图片的碎片化

用 Core Animation 实现图片的碎片化 参考书籍:   效果如下: 原理其实非常简单哦:). 1. 创建一个CALayer,使用其 contents 属性来装载一张图片(获取图片的CGImage) 2. 根据frame值裁剪图片,然后将裁剪的图片赋给你创建的更小的CALayer 3. 实现这些更小的CALayer的动画 4. 剩下的该干嘛干嘛,比如使用 Core Image 滤镜什么的,就靠你创造了:)       核心代码:   源码(书中提供,并非本人所写): /*** * Ex

和菜头:在碎片化的轰炸中喘息

博客.微博.微信,我们在数字化时代迎来了信息的大爆炸,也迎来了信息的碎片化.一条信息被140个字的微博翻新.重组.恶搞,最终就被"翻译"成一条又一条的段子. @和菜头 就为此宣布"准备停止微博一段时间",并撰文戏称"碎片化阅读对我的大脑有所损伤". 碎片化生存 --和菜头在其博文中提到"现在这世界基本上已经是一个由信息碎片所构成的大型显示屏,完整的信息已经非常少见." 微博带来的是什么 微博要求一个人迅速在各种信息之间跳转,不

如何在信息碎片化下生存

随着科技的进步以及时代的快速发展,数字化时代迎来了信息的大爆炸,博客.微博.微信都是当前最热门的信息聚集地.不过与此同时,也迎来了信息的碎片化.一条信息被140个字的微博翻新.重组.恶搞,之后就被"翻译"成为一条又一条的段子. 碎片化生存 现在这世界基本上已经是一个由信息碎片所构成的大型显示屏,完整的信息已经不多了." 微博要求一个人迅速在各种信息之间跳转,不要在任意一条信息上停留过多时间.又要求一个人尽可能快地消费一条信息,迅速咬住它,吸干其中的汁液,然后一口吐掉.最后,对

旅行碎片化的再组织

随着各类垂直社交如雨后春笋般涌现,旅游类社交网站也呈现出了蓬勃发展的势头.而SNS为这个传统行业注入了新的活力,从传统的论坛模式转型成为新型的旅游社区.和以往更多地是被动放接受旅游机构形形色色的宣传信息比起来,社交网络为人们提供了获取更加真实的旅游信息的方式,而通过网友们真实地晒自己在旅途中的见闻,从而让网友们更真实的了解到当地的风土人情,更加的真切可信.而来自亲朋好友的评价肯定比陌生人的更具有说服力,所以一条来自好友的好评胜过别人的千言万语. 而旅游,其实与"移动"密切相关,移动互联

求asp.net 中,在JPG图片上添加GIF动画水印的方法!

问题描述 求asp.net中,在JPG图片上添加GIF动画水印的方法!搜索了很长时间,没找到,朋友们帮忙一下! 解决方案 解决方案二:使用第三方组件加水印比较方便随便baidugoogle一下也有几百个结果解决方案三:JPG和GIF是两中格式,一种是会动的,一种是不会动的.如果你要在jpg图片上加动画水印,我是不是可以理解为你重绘了一张GIF动化效果,然后把这个JPG图片插入到每一帧当中.个人觉得太不现实也太过烦琐.解决方案四://加水印----------------->stringwImag

在屏幕上画个C—基于人机工程学的安卓导航碎片化解决方案

这是一篇让人兴奋的文章,作者Greg Nudelman是一位安卓系统专家,他在文中提出了"C手势"导航代替现有安卓导航的构想,而且毫不吝啬的提供了两种设计方案并对关键代码做了详尽的解释. "C手势"是作者提出的解决安卓导航碎片化的方案.强调的是"在需要的时候随时从屏幕任何区域调用上下文导航是适用于任何触屏设备的功能模型."也就是"隐藏式瑞士军刀风格"(Hidden Swiss Army knife-style)的一种.作者认为

Facebook图谱搜索争议 大数据存碎片化缺陷

搜索一直是互联网行业中盈利能力最强的业务.近年来,Facebook流量已超过谷歌,但是谷歌的利润却超过Facebook近十倍.如何在海量用户和数据中掘金,一直是Facebook的一道难题. 本月中,Facebook推出了站内社交搜索工具"图谱搜索"(Graph Search),公司CEO扎克伯格在发布会上介绍,Graph Search现在将是Facebook产品重要的组成部分,继动态推送(News feed)和时间轴(Time line)之后成为该公司的第三大支柱. 扎克伯格和图谱搜索

许朝军:不惧抄袭 “啪啪”唤醒的碎片化娱乐

2012年,一款名为啪啪的有声照片移动社区频见于微博,我们此前也曾有"语音照片应用啪啪:虚火还是传奇?"的评论.点点网.啪啪创始人兼CEO许朝军近日做客微访谈,这个尚未接受过媒体采访的低调团队现身解答网友疑问. 在访谈中许朝军提到,点点与啪啪是两个产品,点点会专注于轻博客,而啪啪会专注于移动图片语音社区.他对啪啪的定义是"一个垂直化的照片语音社区(PVC): photo vioce community".关于商业模式的疑问,许朝军认为需要建立在一定规模的http:/