图片和图形之使用Palette API选择颜色(5)

原文

概要

良好的视觉设计对于成功的应用程序至关重要,色彩方案是设计的主要组成部分。调色板库是一个 支持库 ,可从图像中提取突出的颜色,帮助您创建视觉上吸引人的应用程序。

您可以使用调色板库设计布局 主题并将自定义颜色应用于应用中的可视元素。例如,您可以使用调色板根据其专辑封面为歌曲创建颜色协调的标题卡,或在背景图像更改时调整应用程序的工具栏颜色。通过该Palette对象,您可以访问Bitmap 图像中的颜色,同时还可以从位图提供六种主要颜色配置文件,以帮助通知您的设计选择。

Set up the library


要使用调色板库,请将Android支持库安装或更新至24.0.0或更高版本,并按照添加支持库的说明将调色板库添加到您的应用开发项目中。

确保您的依赖关系标识符中指定的版本与您的应用程序相匹配compileSdkVersion,并在build.gradle 文件中设置:

android {
  compileSdkVersion 26
  ...
}

dependencies {
  ...
  implementation 'com.android.support:palette-v7:27.1.1'
}
注意:如果您使用 Android插件for Gradle 3.0.0或更高版本 ,请使用“ implementation”关键字。如果您正在使用Gradle的另一个版本的Android插件,请使用“ compile”关键字。

创建一个调色板


通过Palette对象,您可以访问图像中的主要颜色以及覆盖文本的相应颜色。使用调色板设计应用程序的样式,并根据给定的源图像动态更改应用程序的颜色方案。

要创建调色板,请首先Palette.Builder 从a 实例化a Bitmap。您可以Palette.Builder在生成之前使用 自定义调色板。本节将从位图图像描述调色板的生成和定制。

生成一个Palette实例

生成Palette使用实例Palette的 from(Bitmap bitmap)方法先创建一个Palette.Builder 从Bitmap。然后,构建器可以同步或异步生成调色板。

如果要在调用的方法所在的同一线程上创建调色板,请使用同步调色板生成。如果您在不同的线程上异步生成调色板,请使用该onGenerated() 方法在创建后立即访问调色板。

以下代码片段为两种类型的调色板生成提供了示例方法:

// 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.FilterisAllowed()

maximumColorCount()

该方法设置调色板中的最大颜色数量。默认值是16,最佳值取决于源图像。对于风景,最佳值范围为8-16,而带有面部的图片通常具有在24-32之间的值。将 Palette.Builder需要更长的时间来产生更多的颜色的调色板。

setRegion()

此方法指示构建器在创建调色板时使用的位图区域。您只能在从位图生成调色板时使用此方法,并且不会影响原始图像。

addTarget()

此方法允许您通过向Target 构建器添加颜色配置文件来执行自己的颜色匹配 。如果默认值Target不够,高级开发人员可以Target使用a 创建自己的s Target.Builder。

提取颜色配置文件

基于材料设计标准,调色板库从图像中提取常用的颜色配置文件。每个配置文件由a定义Target,并且根据饱和度,亮度和总体(由颜色表示的位图中的像素数),针对每个配置文件对从位图图像提取的颜色进行评分。对于每个配置文件,具有最佳分数的颜色定义给定图像的颜色配置文件。

默认情况下,Palette对象包含来自给定图像的16种主要颜色。在生成调色板时,可以使用“ 自定义 ”颜色自定义颜色数量 Palette.Builder。提取更多颜色可为每个颜色配置文件提供更多潜在匹配,但也会导致Palette.Builder在生成调色板时花费更长时间。

调色板库尝试提取以下六种颜色配置文件:

*   Light Vibrant 光充满活力
*   Vibrant 充满活力
*   Dark Vibrant 黑暗充满活力
*   Light Muted 光线静音
*   Muted 静音
*   Dark Muted 黑暗静音

每个Palette的 方法返回与该特定分布,其中相关联的调色板的颜色是由六种颜色配置文件之一的名称代替。例如,获取Dark Vibrant颜色配置文件的方法是。由于并非所有图像都将包含所有颜色配置文件,因此还必须提供默认颜色才能返回。get<Profile>Color()<Profile>getDarkVibrantColor()

如图显示了方法中的照片及其对应的颜色配置文件。get<Profile>Color()

图片和图形之使用Palette API选择颜色(5)

使用色板创建配色方案

所述Palette类还产生Palette.Swatch 用于每个颜色特征文件的对象。Palette.Swatch 对象包含该配置文件的关联颜色,以及以像素为单位的颜色总体。

色板还可以使用其他方法访问有关颜色配置文件的更多信息,例如HSL值和像素群体。您可以使用色板帮助使用getBodyTextColor() 和getTitleTextColor() 方法创建更全面的配色方案和应用主题。这些方法返回适合在色板颜色上使用的颜色。

每一个Palette的 方法返回一个特定的分布,其中相关的样本是由六种颜色配置文件之一的名称所取代。尽管调色板的方法不需要默认值参数,但如果该特定配置文件不存在于图像中,它们将返回。因此,在使用它之前,您应该检查色板是否为空。例如,如果Vibrant swatch样本不为null,则以下代码将从调色板中获取标题文本颜色:get<Profile>Swatch()<Profile>get<Profile>Swatch()null:

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

要访问调色板中的所有颜色,该getSwatches() 方法将返回从图像生成的所有色板的列表,包括标准的六种颜色配置文件。

以下代码片段使用上述代码片段中的方法来同步生成调色板,获取其充满活力的色板,并更改工具栏的颜色以匹配位图图像。图2显示了生成的图像和工具栏。

// 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 code snippet above 
    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);
} 

图片和图形之使用Palette API选择颜色(5)

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

图片和图形之使用Palette API选择颜色(5)

猜你喜欢

转载自blog.51cto.com/4789781/2120421