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个:)

  • 相关阅读:
    保存会话数据——cookie学习
    HttpServletRequest学习
    HttpServletResponse 学习
    Servlet学习
    Http协议简单学习笔记
    利用tomcat配置网站
    PHPCMS-V9 获取一级栏目、二级栏目、三级栏目
    PHP判断当前访问的是 微信、iphone、android 浏览器
    二维数组根据某个字段排序
    动物界的再生一个故事
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3841053.html
Copyright © 2011-2022 走看看