zoukankan      html  css  js  c++  java
  • 手绘彩色光圈

    手绘彩色光圈

    http://code4app.com/ios/Quart2D%E6%89%8B%E7%BB%98%E5%BD%A9%E8%89%B2%E5%85%89%E5%9C%88/53b7c132933bf0191b8b4680

    效果(本人根据上述源码进行了很大的改动):

    源码:

    MulticolorView.h

    //
    //  MulticolorView.h
    //  MulticolorLayerDemo
    //
    //  Created by Liuyu on 14-7-5.
    //
    //  Modify by YouXianMing on 14-7-13
    //
    //  Copyright (c) 2014年 Liuyu. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface MulticolorView : UIView
    
    @property (nonatomic, assign) CGFloat          lineWidth;  // 圆的线宽
    @property (nonatomic, assign) CFTimeInterval   sec;        //
    @property (nonatomic, assign) CGFloat          percent;    // 百分比
    
    @property (nonatomic, strong) NSArray         *colors;     // 颜色组(CGColor)
    
    - (void)startAnimation;
    - (void)endAnimation;
    
    @end

    MulticolorView.m

    //
    //  MulticolorView.m
    //  MulticolorLayerDemo
    //
    //  Created by Liuyu on 14-7-5.
    //
    //  Modify by YouXianMing on 14-7-13
    //
    //  Copyright (c) 2014年 Liuyu. All rights reserved.
    //
    
    
    #import "MulticolorView.h"
    
    @interface MulticolorView ()
    
    @property (nonatomic, strong) CAShapeLayer *circleLayer;
    
    @end
    
    @implementation MulticolorView
    
    #pragma mark - 将当前view的layer替换成渐变色layer
    + (Class)layerClass
    {
        return [CAGradientLayer class];
    }
    
    #pragma mark - 初始化
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self)
        {
            _circleLayer = [CAShapeLayer layer];
        }
        return self;
    }
    
    #pragma mark - 配置颜色
    - (void)setupMulticolor
    {
        // 获取当前的layer
        CAGradientLayer *gradientLayer = (CAGradientLayer *)[self layer];
        
        // 创建颜色数组
        NSMutableArray *colors = [NSMutableArray array];
        
        // 如果自定义颜色为空
        if (_colors == nil)
        {
            for (NSInteger hue = 0; hue <= 360; hue += 10)
            {
                [colors addObject:(id)[UIColor colorWithHue:1.0*hue/360.0
                                                 saturation:1.0
                                                 brightness:1.0
                                                      alpha:1.0].CGColor];
            }
            
            // 给渐变色layer设置颜色
            [gradientLayer setColors:[NSArray arrayWithArray:colors]];
        }
        else
        {
            // 给渐变色layer设置颜色
            [gradientLayer setColors:_colors];
        }
    }
    
    #pragma mark - 配置圆形
    - (CAShapeLayer *)produceCircleShapeLayer
    {
        // 生产出一个圆的路径
        CGPoint circleCenter = CGPointMake(CGRectGetMidX(self.bounds),
                                           CGRectGetMidY(self.bounds));
        
        CGFloat circleRadius = 0;
        
        if (_lineWidth == 0)
        {
            circleRadius = self.bounds.size.width/2.0 - 2;
        }
        else
        {
            circleRadius = self.bounds.size.width/2.0 - 2*_lineWidth;
        }
    
        UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:circleCenter
                                                                  radius:circleRadius
                                                              startAngle:M_PI
                                                                endAngle:-M_PI
                                                               clockwise:NO];
        
        // 生产出一个圆形路径的Layer
        _circleLayer.path          = circlePath.CGPath;
        _circleLayer.strokeColor   = [UIColor whiteColor].CGColor;
        _circleLayer.fillColor     = [[UIColor clearColor] CGColor];
        
        if (_lineWidth == 0)
        {
            _circleLayer.lineWidth     = 1;
        }
        else
        {
            _circleLayer.lineWidth     = _lineWidth;
        }
        
        // 可以设置出圆的完整性
        _circleLayer.strokeStart = 0;
        _circleLayer.strokeEnd = 1.0;
        
        return _circleLayer;
    }
    
    #pragma mark - Animation
    
    - (void)startAnimation
    {
        // 设置渐变layer以及其颜色值
        [self setupMulticolor];
        
        // 生产一个圆形路径并设置成遮罩
        self.layer.mask = [self produceCircleShapeLayer];
        
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        
        if (_sec == 0)
        {
            animation.duration = 5;
        }
        else
        {
            animation.duration = _sec;
        }
        
        animation.repeatCount       = MAXFLOAT;
        animation.fromValue         = [NSNumber numberWithDouble:0];
        animation.toValue           = [NSNumber numberWithDouble:M_PI*2];
        [self.layer addAnimation:animation forKey:nil];
    }
    
    @synthesize percent = _percent;
    -(CGFloat)percent
    {
        return _percent;
    }
    
    - (void)setPercent:(CGFloat)percent
    {
        if (_circleLayer)
        {
            _circleLayer.strokeEnd = percent;
        }
    }
    
    - (void)endAnimation
    {
        [self.layer removeAllAnimations];
    }
    
    @end

    ViewController.m

    //
    //  ViewController.m
    //  MulticolorLayerDemo
    //
    //  Created by Liuyu on 14-7-5.
    //
    //  Modify by YouXianMing on 14-7-13
    //
    //  Copyright (c) 2014年 Liuyu. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "MulticolorView.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) NSTimer         *timer;
    @property (nonatomic, strong) MulticolorView  *showView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        _showView           = [[MulticolorView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        _showView.lineWidth = 1.f;
        _showView.sec       = 2.f;
        _showView.colors    = @[(id)[UIColor cyanColor].CGColor,
                                (id)[UIColor yellowColor].CGColor,
                                (id)[UIColor cyanColor].CGColor];
        _showView.center    = self.view.center;
        _timer              = [NSTimer scheduledTimerWithTimeInterval:1
                                                               target:self
                                                             selector:@selector(event:)
                                                             userInfo:nil
                                                              repeats:YES];
        
        [self.view addSubview:_showView];
        [_showView startAnimation];
    }
    
    - (void)event:(id)object
    {
        _showView.percent = arc4random()%100/100.f;
    }
    
    @end

    原理:

    1. 改变view的backedlayer为渐变色layer

    2. 给这个view添加一个shapeLayer

    3. 将这个shapeLayer当这个view的backedlayer

    4. 动画

    5. 结束:)

    可以设置的参数有4个:)

  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number (考虑负数的情况)
    8. String to Integer (整数的溢出)
    7. Reverse Integer (整数的溢出)
    LeetCode Minimum Size Subarray Sum
    LeetCode Course Schedule II
    Linux 文件缓存 (一)
    LeetCode Tries Prefix Tree
    Linux : lsof 命令
    LeetCode Binary Tree Right Side View
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3841053.html
Copyright © 2011-2022 走看看