使用 Palette API 選取顏色

良好的視覺設計是成功的應用程式不可或缺的要素,色彩配置是設計的主要元件。Palette 程式庫是 Jetpack 程式庫,可從圖片擷取醒目顏色,打造引人注目的應用程式。

您可以使用調色盤程式庫設計版面配置主題,並將自訂顏色套用至應用程式的視覺元素。舉例來說,您可以使用調色盤,根據專輯封面建立不同顏色的片頭資訊卡,或在背景圖片變更時調整應用程式的工具列顏色。Palette 物件可讓您存取 Bitmap 圖片中的顏色,同時提供點陣圖中的六個主要顏色設定檔,做為設計選擇的參考依據。

設定程式庫

如要使用調色盤程式庫,請將以下內容新增至 build.gradle

Kotlin

android {
    compileSdkVersion(33)
    ...
}

dependencies {
    ...
    implementation("androidx.palette:palette:1.0.0")
}

Groovy

android {
    compileSdkVersion 33
    ...
}

dependencies {
    ...
    implementation 'androidx.palette:palette:1.0.0'
}

建立調色盤

Palette 物件可讓您使用圖片的主要顏色,以及重疊文字的對應顏色。您可以使用調色盤設計應用程式的樣式,並根據指定來源圖片動態變更應用程式的色彩配置。

如要建立區塊面板,請先從 BitmapPalette.Builder 例項化。然後,您就可以先使用 Palette.Builder 自訂調色盤,然後再產生調色盤。本節說明從點陣圖圖片產生及自訂區塊面板。

產生調色盤執行個體

使用其 from(Bitmap bitmap) 方法產生 Palette 例項,先從 Bitmap 建立 Palette.Builder

建構工具可以同步或非同步產生區塊面板。如果想在呼叫方法的同一個執行緒上建立調色盤,請使用同步調色盤產生功能。在其他執行緒上以非同步方式產生區塊面板,請在建立後使用 onGenerated() 方法立即存取區塊面板。

以下程式碼片段提供這兩種區塊產生方式的範例方法:

Kotlin

// Generate palette synchronously and return it.
fun createPaletteSync(bitmap: Bitmap): Palette = Palette.from(bitmap).generate()

// Generate palette asynchronously and use it on a different thread using onGenerated().
fun createPaletteAsync(bitmap: Bitmap) {
    Palette.from(bitmap).generate { palette ->
        // Use generated instance.
    }
}

Java

// Generate palette synchronously and return it.
public Palette createPaletteSync(Bitmap bitmap) {
  Palette p = Palette.from(bitmap).generate();
  return p;
}

// Generate palette asynchronously and use it on a different thread using onGenerated().
public void createPaletteAsync(Bitmap bitmap) {
  Palette.from(bitmap).generate(new PaletteAsyncListener() {
    public void onGenerated(Palette p) {
      // Use generated instance.
    }
  });
}

如果您需要持續為經過排序的圖片或物件清單產生調色盤,請考慮快取 Palette 例項,以免 UI 效能緩慢。請勿在主執行緒中建立調色盤。

自訂調色盤

您可以利用 Palette.Builder 自訂調色盤中的調色盤,方法是選擇產生的調色盤中的顏色數量、建構工具用來產生調色盤的圖片區域,以及調色盤中包含哪些顏色。舉例來說,您可以過濾掉黑色顏色,或確保建構工具只使用圖片的上半部來產生調色盤。

請使用 Palette.Builder 類別的下列方法,微調區塊面板的大小和顏色:

addFilter()
這個方法會新增篩選器,指出產生的調色盤中可允許的顏色。傳入自己的 Palette.Filter 並修改其 isAllowed() 方法,藉此判斷哪些顏色會從調色盤中篩除。
maximumColorCount()
這個方法可設定調色盤中的顏色數量上限。預設值為 16,最佳值則視來源映像檔而定。針對橫向,最佳值介於 8 到 16 之間,有臉孔的圖片值通常介於 24 至 32 之間。Palette.Builder 需要較長的時間才能產生顏色更多的調色盤。
setRegion()
這個方法可指出建構工具在建立調色盤時會使用點陣圖的區域。只有在從點陣圖產生調色盤時才能使用這個方法,且不會影響原始圖片。
addTarget()
這個方法可讓您在建構工具中新增 Target 顏色設定檔,以執行自己的色彩比對。如果預設的 Target 不足,進階開發人員可以使用 Target.Builder 建立自己的 Target

擷取顏色設定檔

根據 Material Design 的標準,Palette 程式庫會從圖片擷取常用的顏色設定檔。每個設定檔都是由 Target 定義,系統會按照飽和度、亮度和人口 (點陣圖中的像素數量,以顏色表示) 為各個設定檔評分。針對每個設定檔,分數最高的顏色會定義指定圖片的顏色設定檔。

根據預設,Palette 物件包含指定圖片的 16 種主要顏色。產生調色盤時,您可以使用 Palette.Builder 自訂其顏色數量。擷取更多顏色可為每個顏色設定檔提供更多可能的相符項目,但也會導致 Palette.Builder 產生調色盤時更長的時間。

Palette 程式庫會嘗試擷取下列六個色彩設定檔:

  • 淺鮮豔
  • 繽紛
  • 深鮮豔
  • 已設為靜音
  • 已靜音
  • 已靜音

Palette 中的每個 get<Profile>Color() 方法都會傳回與該特定設定檔相關聯的調色盤中的顏色,其中 <Profile> 會替換成六種顏色設定檔中的一個名稱。舉例來說,取得深色色彩設定檔的方法為 getDarkVibrantColor()。由於並非所有圖片都包含所有顏色設定檔,請提供要傳回的預設顏色。

圖 1 顯示了 get<Profile>Color() 方法中的相片及其對應的色彩設定檔。

左側圖片顯示日落,右側顯示擷取的調色盤。
圖 1:指定調色盤預設色彩數量上限 (16) 的範例圖片及其擷取的色彩設定檔。

使用色塊建立色彩配置

Palette 類別也會為每個顏色設定檔產生 Palette.Swatch 物件。Palette.Swatch 物件包含該設定檔的關聯顏色,以及顏色的母體 (以像素為單位)。

色票有其他方法,可用於存取顏色設定檔的詳細資訊,例如 HSL 值和像素人口。您可以使用 getBodyTextColor()getTitleTextColor() 方法,使用色塊建立更完整的色彩配置和應用程式主題。這些方法會傳回適合用於色塊顏色的顏色。

Palette 中的每個 get<Profile>Swatch() 方法都會傳回與該設定檔相關聯的色票,其中 <Profile> 會替換為六個顏色設定檔其中一個的名稱。雖然區塊面板的 get<Profile>Swatch() 方法不需要預設值參數,但如果圖片中不存在該特定設定檔,就會傳回 null。因此,請先檢查色塊並非空值。舉例來說,如果鮮明的色票不是空值,以下程式碼會從調色盤中取得標題文字顏色:

Kotlin

val vibrant = myPalette.vibrantSwatch
// In Kotlin, check for null before accessing properties on the vibrant swatch.
val titleColor = vibrant?.titleTextColor

Java

Palette.Swatch vibrant = myPalette.getVibrantSwatch();
if(vibrant != null){
    int titleColor = vibrant.getTitleTextColor();
    // ...
}

如要存取調色盤中的所有顏色,getSwatches() 方法會傳回圖片產生的所有色票清單,包括標準六種色彩設定檔。

以下程式碼片段使用上述程式碼片段中的方法,同步產生調色盤、取得其繽紛的色表,並配合點陣圖圖片變更工具列顏色。圖 2 顯示產生的圖片和工具列。

Kotlin

// Set the background and text colors of a toolbar given a bitmap image to
// match.
fun setToolbarColor(bitmap: Bitmap) {
    // Generate the palette and get the vibrant swatch.
    val vibrantSwatch = createPaletteSync(bitmap).vibrantSwatch

    // Set the toolbar background and text colors.
    // Fall back to default colors if the vibrant swatch isn't available.
    with(findViewById<Toolbar>(R.id.toolbar)) {
        setBackgroundColor(vibrantSwatch?.rgb ?:
                ContextCompat.getColor(context, R.color.default_title_background))
        setTitleTextColor(vibrantSwatch?.titleTextColor ?:
                ContextCompat.getColor(context, R.color.default_title_color))
    }
}

Java

// Set the background and text colors of a toolbar given a bitmap image to
// match.
public void setToolbarColor(Bitmap bitmap) {
    // Generate the palette and get the vibrant swatch.
    // See the createPaletteSync() method from the preceding code snippet.
    Palette p = createPaletteSync(bitmap);
    Palette.Swatch vibrantSwatch = p.getVibrantSwatch();

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    // Load default colors.
    int backgroundColor = ContextCompat.getColor(getContext(),
        R.color.default_title_background);
    int textColor = ContextCompat.getColor(getContext(),
        R.color.default_title_color);

    // Check that the Vibrant swatch is available.
    if(vibrantSwatch != null){
        backgroundColor = vibrantSwatch.getRgb();
        textColor = vibrantSwatch.getTitleTextColor();
    }

    // Set the toolbar background and text colors.
    toolbar.setBackgroundColor(backgroundColor);
        toolbar.setTitleTextColor(textColor);
}
顯示日落和工具列的圖片,其中含有 TitleTextColor
圖 2 包含鮮豔工具列和對應標題文字顏色的範例圖片。