Palette 是 Android Support Library(现已迁移至 AndroidX palette 库)提供的取色工具,可以从 Bitmap 中自动提取一组代表色。在 Material Design 中,从图片提取色彩并应用到 UI 元素是常见的设计手法,Palette 让这一过程变得非常简单。

palette01

支持的颜色类型

Palette 提供六种色调类型,覆盖从鲜艳到暗淡的不同风格:

色调类型说明
Vibrant鲜艳
Vibrant Dark鲜艳暗色
Vibrant Light鲜艳亮色
Muted暗淡
Muted Dark暗淡暗色
Muted Light暗淡亮色

每种色调对应一个 Palette.Swatch 对象,包含 RGB 值、HSL 值、像素占比(population),以及适合在该色块上展示的标题和正文文本颜色。

基本用法

Palette 支持同步和异步两种生成方式:

1
2
3
4
5
6
7
8
9
// 同步生成(需在后台线程执行)
public static Palette generate (Bitmap bitmap);
public static Palette generate (Bitmap bitmap, int numColors);

// 异步生成(自动在后台线程执行)
public static AsyncTask<Bitmap, Void, Palette> generateAsync (
    Bitmap bitmap, Palette.PaletteAsyncListener listener);
public static AsyncTask<Bitmap, Void, Palette> generateAsync (
    Bitmap bitmap, int numColors, Palette.PaletteAsyncListener listener);

同步方法 generate 速度很快,约几十毫秒。异步方式则通过 AsyncTask 在后台线程执行,结果通过回调返回。

关于 numColors 参数

numColors 控制提取的颜色数量,取值取决于图片类型:

风景照推荐 12-16,人物肖像建议 24-32。

数量越少生成速度越快,越多则色彩越精细。如果未指定,默认值为 16。

示例代码

以下示例从 Bitmap 提取颜色并应用到 ActionBar 和一组 View 上:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Bitmap bitmap = BitmapFactory.decodeResource(
    getResources(), R.drawable.strictdroid);
Palette.generateAsync(bitmap, new PaletteAsyncListener() {

    @Override
    public void onGenerated(Palette palette) {
        getSupportActionBar().setBackgroundDrawable(
                new ColorDrawable(
                    palette.getVibrantSwatch().getRgb()));
        for (int i = 0; i < viewList.size(); i++) {
            View view = viewList.get(i);
            switch (i) {
                case 0:
                    view.setBackgroundColor(
                        palette.getDarkMutedColor(Color.BLACK));
                    break;
                case 1:
                    view.setBackgroundColor(
                        palette.getDarkVibrantColor(Color.BLACK));
                    break;
                case 2:
                    view.setBackgroundColor(
                        palette.getLightMutedColor(Color.BLACK));
                    break;
                case 3:
                    view.setBackgroundColor(
                        palette.getLightVibrantColor(Color.BLACK));
                    break;
                case 4:
                    view.setBackgroundColor(
                        palette.getMutedColor(Color.BLACK));
                    break;
                case 5:
                    view.setBackgroundColor(
                        palette.getVibrantColor(Color.BLACK));
                    break;
            }
        }
    }
});

每种 getXxxColor() 方法都接受一个默认颜色参数,当该色调类型在图片中不存在时使用。

迁移至 AndroidX

原始 v7 Palette 库已迁移至 AndroidX,新依赖为:

1
implementation("androidx.palette:palette:1.0.0")

API 用法基本一致。Builder 模式推荐使用 Palette.from(bitmap).generate(),支持更多自定义选项,如 maximumColorCount()addFilter()resizeBitmapArea() 等。

参考