根据给定颜色定位到彩色圆上的位置

2017-10-28  本文已影响28人  水煮杰尼龟

项目中有这样的需求,获取到的某一种颜色,将button 定位到彩色圆上的位置。
这里需要用到HSB的概念了。

色相H( Hue ):在0~360°的标准色环上,按照角度值标识。比如红是0°、橙色是30°等。
饱和度S( saturation ):是指颜色的强度或纯度。饱和度表示色相中彩色成分所占的比例,用从0%(灰色)~100%(完全饱和)的百分比来度量。在色立面上饱和度是从内向外逐渐增加。
亮度B( brightness ):是颜色的明暗程度,通常是从0(黑)~100%(白)的百分比来度量的,在色立面中从上至下逐渐递减,上边线为100%,下边线为0% 。

既然是0~360°,红色的是0°. 根据角度来定位。
当然这是一种思路而已,大屌绕道。
举个我这边的例子:我这边是根据一张彩色的图片来的

    UIImageView *imgView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Combined Shape"]];
    imgView.frame=CGRectMake(70, 74, 235, 235);
    imgView.userInteractionEnabled=YES;
    [self.view addSubview:imgView];
    self.imgView=imgView;
    
    UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
    btn.layer.cornerRadius=11.5;
    btn.backgroundColor=[UIColor clearColor];
    btn.layer.borderColor=[UIColor whiteColor].CGColor;
    btn.layer.borderWidth=2;
    btn.size=CGSizeMake(23, 23);
    btn.center=CGPointMake(imgView.frame.size.width/2, imgView.frame.size.height/2-107);
    [imgView addSubview:btn];
    self.sliderBtn=btn;
    
    [[[UIColor redColor] neoToHSL] getHue:&_hue saturation:&_saturation brightness:&_luminosity alpha:&_alpha];
    [self positionHue];
- (void) positionHue {
    CGFloat angle = M_PI * 2 * _hue+M_PI*1/3;
    CGFloat cx = 107 * cos(angle) + self.imgView.frame.size.width/2 ;
    CGFloat cy = 107 * sin(angle) + self.imgView.frame.size.width/2 ;
    CGRect frame = self.sliderBtn.frame;
    frame.origin.x = cx;
    frame.origin.y = cy;
    self.sliderBtn.center = CGPointMake(cx, cy);
}

如上代码得到的效果就是这样:

1.png

可以看出定位在红色位置了, 我这边因为是红色并不在0度的位置,所以+M_PI*1/3的角度,这个自行调整。

颜色是先转成HSL的Color了再获取到饱和度。
位置就根据角度来算了,考验数学能力了。
其他就根据自身需求做一些调整,修改咯。

最后摆一个转HSL的分类:

- (UIColor *) neoToHSL {
    CGFloat h, s, l, w, a;
    if ([self getHue:&h saturation:&s brightness:&l alpha:&a]) {
        return self;
    } else if ([self getWhite:&w alpha:&a]) {
        return [UIColor colorWithHue:0 saturation:0 brightness:w alpha:a];
    } else {
        CGFloat r, g, b;
        [self getRed:&r green:&g blue:&b alpha:&a];
        CGFloat min, max, delta;
        min = MIN(MIN(r, g), b);
        max = MAX(MAX(r, g), b);
        delta = max - min;
        l = (max + min) / 2;
        if (delta == 0) {
            h = 0;
            s = 0;
        } else {
            if (l < 0.5 ) {
                s = max / ( max + min );
            } else {
                s = max / ( 2 - max - min );
            }
            
            CGFloat dR, dG, dB;
            
            dR = (((max - r) / 6.0) + (max / 2)) / max;
            dG = (((max - g) / 6) + (max / 2)) / max;
            dB = (((max - b) / 6) + (max / 2)) / max;

            if (r == max) {
                h = dB - dG;
            } else if (g == max) {
                h = 1/3 + dR - dB;
            } else if (b == max) {
                h = 2/3 + dG - dR;
            }
            
            if (h < 0) h += 1;
            if (h > 1) h -= 1;
        }
        return [UIColor colorWithHue:h saturation:s brightness:l alpha:a];
    }
}
上一篇下一篇

猜你喜欢

热点阅读