zoukankan      html  css  js  c++  java
  • 高级mask应用

    高级mask应用

    用mask做遮罩可以实现复杂的效果:

    用来形成遮罩的图片:

    原始图片:

    如果你熟悉Photoshop,那这种效果绝对是你的菜,看代码你会秒懂......

    //
    //  RootViewController.m
    //  ShapeMask
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import "UIImage+ImageEffects.h"
    
    @interface RootViewController ()
    
    @property (nonatomic, strong) CALayer *movedMask;
    
    @end
    
    @implementation RootViewController
    
    - (void)handlePan:(UIPanGestureRecognizer *)recognizer
    {
        // 拖拽
        CGPoint translation = [recognizer translationInView:self.view];
        recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                             recognizer.view.center.y + translation.y);
        [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
        
        // 关闭CoreAnimation实时动画绘制(核心)
        [CATransaction setDisableActions:YES];
        _movedMask.position = recognizer.view.center;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor blackColor];
    
        // 背景图片与mask图片
        UIImage *bgImage = [UIImage imageNamed:@"bg"];
        UIImage *image = [UIImage imageNamed:@"mask"];
        
        // 背景图片显示
        UIImageView *bgImageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
        bgImageView.image = [bgImage grayScale];
        [self.view addSubview:bgImageView];
        
        // 遮罩背景图片显示
        UIImageView *bgChangedImageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
        bgChangedImageView.image = bgImage;
        [self.view addSubview:bgChangedImageView];
        
        // 形成遮罩
        _movedMask          = [CALayer layer];
        _movedMask.frame    = (CGRect){CGPointZero, image.size};
        _movedMask.contents = (__bridge id)(image.CGImage);
        _movedMask.position = self.view.center;
        bgChangedImageView.layer.mask = _movedMask;
        
        // 拖拽的View
        UIView *dragView = [[UIView alloc] initWithFrame:(CGRect){CGPointZero, image.size}];
        dragView.center = self.view.center;
        [self.view addSubview:dragView];
        
        // 给dragView添加拖拽手势
        UIPanGestureRecognizer *recognizer = 
        [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                action:@selector(handlePan:)];
        [dragView addGestureRecognizer:recognizer];
    }
    
    @end

    要点:

    你可以直接使用带透明像素的PNG图片来制作复杂的mask,相对于CAShapeLayer绘制路径来做mask,此种方式更简单暴力高效.

    附录:

    配合CAEmitterLayer使用,可以实现非常非常绚丽复杂的动画效果,绝对高大上:)

    //
    //  RootViewController.m
    //  ShapeMask
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import "UIImage+ImageEffects.h"
    
    @interface RootViewController ()
    
    @property (nonatomic, strong) CALayer *movedMask;
    
    @end
    
    @implementation RootViewController
    
    - (void)handlePan:(UIPanGestureRecognizer *)recognizer
    {
        // 拖拽
        CGPoint translation = [recognizer translationInView:self.view];
        recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                             recognizer.view.center.y + translation.y);
        [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
        
        // 关闭CoreAnimation实时动画绘制(核心)
        [CATransaction setDisableActions:YES];
        _movedMask.position = recognizer.view.center;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor blackColor];
    
        // 创建粒子Layer
        CAEmitterLayer *snowEmitter = [CAEmitterLayer layer];
        
        // 粒子发射位置
        snowEmitter.emitterPosition = CGPointMake(120,0);
        
        // 发射源的尺寸大小
        snowEmitter.emitterSize = self.view.bounds.size;
        
        // 发射模式
        snowEmitter.emitterMode = kCAEmitterLayerSurface;
        
        // 发射源的形状
        snowEmitter.emitterShape = kCAEmitterLayerLine;
        
        // 创建雪花类型的粒子
        CAEmitterCell *snowflake = [CAEmitterCell emitterCell];
        
        // 粒子的名字
        snowflake.name = @"snow";
        
        // 粒子参数的速度乘数因子
        snowflake.birthRate = 20.0;
        snowflake.lifetime = 120.0;
        
        // 粒子速度
        snowflake.velocity =10.0;
        
        // 粒子的速度范围
        snowflake.velocityRange = 10;
        
        // 粒子y方向的加速度分量
        snowflake.yAcceleration = 2;
        
        // 周围发射角度
        snowflake.emissionRange = 0.5 * M_PI;
        
        // 子旋转角度范围
        snowflake.spinRange = 0.25 * M_PI;
        snowflake.contents = (id)[[UIImage imageNamed:@"snow"] CGImage];
        
        // 设置雪花形状的粒子的颜色
        snowflake.color = [[UIColor whiteColor] CGColor];
        
        snowflake.scaleRange = 0.6f;
        snowflake.scale = 0.7f;
        
        snowEmitter.shadowOpacity = 1.0;
        snowEmitter.shadowRadius = 0.0;
        snowEmitter.shadowOffset = CGSizeMake(0.0, 0.0);
        
        // 粒子边缘的颜色
        snowEmitter.shadowColor = [[UIColor whiteColor] CGColor];
        
        // 添加粒子
        snowEmitter.emitterCells = @[snowflake];
        
        // 将粒子Layer添加进图层中
        [self.view.layer addSublayer:snowEmitter];
        
        // 形成遮罩
        UIImage *image = [UIImage imageNamed:@"mask"];
        _movedMask          = [CALayer layer];
        _movedMask.frame    = (CGRect){CGPointZero, image.size};
        _movedMask.contents = (__bridge id)(image.CGImage);
        _movedMask.position = self.view.center;
        snowEmitter.mask = _movedMask;
        
        // 拖拽的View
        UIView *dragView = [[UIView alloc] initWithFrame:(CGRect){CGPointZero, image.size}];
        dragView.center = self.view.center;
        [self.view addSubview:dragView];
        
        // 给dragView添加拖拽手势
        UIPanGestureRecognizer *recognizer = 
        [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                action:@selector(handlePan:)];
        [dragView addGestureRecognizer:recognizer];
    }
    
    @end
  • 相关阅读:
    计算机基础
    如何增加一个IT产品的用户黏性
    计算机相关专业一门课程一个案例
    【2012年6月14日】中兴发布Grand(智观)N970
    bmp格式浅析
    3Dbook的使用
    中英文翻译格式
    软件学习书籍推荐
    WEB开发基础
    PHP学习
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3788270.html
Copyright © 2011-2022 走看看