Palette使用简介与实现原理

Palette顾名思义就是一个调色板,它根据传入的bitmap,提取出几种主体颜色,这些颜色如果设置到背景或者字体上,就能使界面色彩元素丰富的同时也不失协调。

使用简介

它是一个建造者模式的实例化模式,用法很简单,总的说来分三步:
1.通过builder添加参数:

Palette p = Palette.from(BitMap)//将图片传入调色板中
                    .addFilter(Filter)//添加一个过滤器,根据HSL过滤(可以不设置,有默认值)
                    .maximumColorCount(20)//设置一个颜色种数的临界值,有效的颜色块数量小于这个值,直接用这些颜色作为最终统计到的样本。有效的颜色块后面解释(可以不设置,有默认值)
                    .resizeBitmapSize(480)//bitmap放入调色板时,会先压缩,提高计算速率,这里就是设置压缩后的尺寸。(可以不设置,有默认值)
                    .clearFilters()//清除颜色过滤器(可以不调用)
                    .generate();//第二步,创建Palette实例。

2.构建Palette实例。产生实例的方法generate有无参和有参数的两个重载方法。

  • 无参的直接返回Palette,是同步方法。
  • 有参的返回的是一个异步任务,通过传入的参数回调。因为统计图片颜色是比较耗时的,颜色种类越多,耗时越长。

3.通过Palette获取颜色。Palette取得的颜色并不是一种,有可能有多个样本。它提供了6种风格的颜色:

p.getDarkMutedColor(defaultColor);
p.getDarkVibrantColor(defaultColor);
p.getLightMutedColor(defaultColor);
p.getLightVibrantColor(defaultColor);
p.getMutedColor(defaultColor);
p.getVibrantColor(defaultColor);~~~~

柔和三种,生动三种。但并不一定每种都采集到了合适的颜色。

实现原理

使用方法讲完, 接下来是分析源码。首先,我们需要了解几个概念:

  • RGB彩色空间:把颜色抽象到空间模型中,“Color Space”,彩色空间,又称作色域。RGB彩色空间是Color Space的一种,将R、G、B三色作为xyz轴,其颜色模型如下图。在这个彩色空间里可以表示所有RGB的颜色(256256256种),当然,这并不代表自然界的所有颜色。
  • HSL:工业界的一种颜色标准,是通过对色相(H)、饱和度(S)、明度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,它和RGB是可以互相转换的。这里就不提供转化算法了。
  • VBox:java对象,代表一个RGB彩色空间,或者说是子彩色空间,下图中的每个方块都可以是一个Vbox。

Palette使用简介与实现原理_第1张图片

Palette的取色原理:通过builder构建palette的过程就是量化统计颜色的过程,这个过程是发生在builder的generate()方法里,首先压缩图片至指定(resizeBitmapSize(int size))或者默认大小,从而减少计算量,然后构建一个ColorCutQuantizer用于颜色采集,采集满足要求颜色的逻辑就是它来实现的。接下来把采集到的样本交给Palette里的Generator,通过Generator筛选出Muted、vibrant等6种风格颜色。

在这个过程中,最重要的当属ColorCutQuantizer的采集过程。这里用到了Median-cut(中位切分法算法)。

你可能感兴趣的:(android,material-design,tools,color)