一、Palette的简介
Android 5.0 Lollipop开始,Google推出了一个叫做Palette的类库,用于从一张图片中提取出关键颜色来进行主题的设置或者自适应颜色的选择,帮助应用实现更加美观的用户界面。
Palette使用起来非常简单,我们只需要把想要提取颜色的图片加载出来,然后调用Palette的API即可。Palette提供了一个Palette.Builder类来帮助我们快速创建一个Palette对象,然后设置要提取的颜色数量、默认颜色值、图片要提取颜色的区域等。在Palette对象创建完成后,我们就可以通过它提供的方法获取到每个颜色的主题和亮度值等等,用于进行应用界面主题的设计。
二、Palette的用法
首先,我们需要添加依赖库:
<dependency>
<groupId>com.android.support</groupId>
<artifactId>palette-v7</artifactId>
<version>27.1.1</version>
</dependency>
接下来,我们就可以在代码中使用Palette库了,我们以ImageView为例:
ImageView imageView = findViewById(R.id.image_view);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_image);
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@Nullable Palette palette) {
if (palette != null) {
Palette.Swatch swatch = palette.getVibrantSwatch();
if (swatch != null) {
// 通过调用swatch的getRgb()方法获取到颜色值,设置给界面元素即可
textView.setTextColor(swatch.getRgb());
...
}
}
}
});
上述代码做了如下事情:
- 加载图片资源。
- 通过Palette库获取到图片中的主题释放,包括亮色、暗色等等,提取的关键颜色数量可以通过生成Palette对象时的Palette.Builder来设置。
- 选择其中一种颜色喂给应用界面元素,比如TextView等等。
三、实战应用
下面我们通过一个简单的案例来演示如何通过Palette来为应用提供合适的主题色。
首先,我们需要根据用户上传的头像,对应界面元素的颜色进行搭配,实现界面的统一和谐。代码如下:
public void updateUIWithAvatar(String avatarUrl) {
Glide.with(this).load(avatarUrl).into(photoView);
Glide.with(this).load(avatarUrl).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
Palette.from(resource).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch swatch = palette.getMutedSwatch();
if (swatch != null) {
toolbar.setBackgroundColor(swatch.getRgb());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(swatch.getRgb());
}
}
}
});
}
});
}
上述代码实现了以下功能:
- 使用Glide来加载头像图片。
- 通过Bitmap转换为Palette所需的资源对象。
- 生成一个Palette对象,获取到头像图片中颜色主题。
- 将获取到的颜色值设置到界面元素上。
我们也可以通过获取到Palette对象后的官方API获取到更多的颜色信息,然后对应反映到应用界面上,实现更加优美的设计效果。
四、总结
Palette库为我们提供了一个非常方便的方式来获取图片资源中的颜色主题,以及色彩的灵活搭配能力。在实际开发中,Palette可以应用到多个场景,包括图片背景、按钮颜色、文本样式等等,通过设置不同的颜色主题来实现应用主题的变化,从而提升应用界面的美观和用户体验。