美文网首页Android干货程序员Android开发
主题颜色提取 ——— Palette

主题颜色提取 ——— Palette

作者: PandaQ404 | 来源:发表于2017-01-10 17:15 被阅读0次

Palette

调色板 Palette 是 Android L SDK 中的新特性。可以使用 Palette 从图像中提取出突出的颜色(主色调),获取到颜色之后我们再将这个颜色值赋给 ActionBar、状态栏等。从而达到界面色调的统一,使界面美观协调。
Palette 可以提取图片中如下几种特性的颜色:

  • Vibrant (有活力的)
  • Vibrant dark(有活力的 暗色调)
  • Vibrant light(有活力的 明亮)
  • Muted (柔和的)
  • Muted dark(柔和的 暗色调)
  • Muted light(柔和的 明亮)

内部嵌套类

  • Palette.Builder
    生成器类,生成 Palette 实例。
  • Palette.Filter
    过滤器接口,使 Palette 有更加细腻的颜色过滤
  • Palette.PaletteAsyncListener
    异步加载监听
  • pattle.Swatch
    提供获取结果的色彩样本

所有的公共方法

返回值类型 方法及说明
static Palette from(List<Palette.Switch> switches)
通过预设的 Palette.Swatch 颜色样本列表 来生成 Palette
static Palette.Builder from(Bitmap bitmap)
通过返回 Palette.Builder 实例来构建 Palette
static Palette generate(Bitmap bitmap,int numColors)
该方法已被遗弃,建议用 Palette.Builder 来生成Palette
static Palette generate(Bitmap bitmap)
该方法已被遗弃,建议用 Palette.Builder 来生成Palette
static AsyncTask<Bitmap,Void,Palette> generateAsync(Bitmap bitmap,int numColor,Palette.PaletteAsyncListener listener)
该方法已被遗弃,建议用 Palette.Builder 来生成Palette
static AsyncTask<Bitmap,Void,Palette> generateAsync(Bitmap bitmap,Palette.PaletteAsyncListener listener)
该方法已被遗弃,建议用 Palette.Builder 来生成Palette
int getColorForTarget(Target target,int defaultColor)
返回一个从目标获取的的 rgb 色值
int getDarkMutedColor(int defaultColor)
返回一个柔和的暗色调 rgb 值
Palette.Swatch getDarkMutedSwatch()
返回一个柔和的暗色调样本类
int getDarkVibrantColor(int defaultColor)
返回一个鲜明的暗色调 rgb 值
Palette.Swatch getDarkVibrantSwatch()
返回一个鲜明的暗色调样本类
int getDomainColor(int defaultColor)
返回 Palette 中的主色调 rgb值
Palette.Swatch getDomainSwatch()
返回一个主色调的样本类
int getLightMutedColor(int defaultColor)
返回一个柔和的亮色调颜色 rgb
Palette.Swatch getLightMutedSwatch()
返回一个柔和的亮色调样本类
int getLightVibrantColor(int defaultColor)
返回一个鲜明的亮色调 rgb
Palette.Swatch getLightVibrantSwatch()
返回一个鲜明的亮色调样本类
int getMutedColor(int defaultColor)
返回一个柔和的颜色 rgb
Palette.Swatch getMutedSwatch()
返回一个柔和的颜色样本类
Palette.Swatch getSwatchForTarget(Target target)
为给定的目标从 Palette 中返回一个选中样本,如果未找到则返回空
List<Palette.Swatch> getSwatches()
获取所有用在Palette中的Swatch样本类
List<Target> getTargets()
获取所有构造 Palette 的 Target
int getVibrantColor(int defaultColor)
获取一个鲜明的颜色 rgb
Palette.Swatch getVibrantSwatch()
获取一个鲜明的样本类

使用方式

使用 Palette 需先引入 Palette 的 support 资源包:

    compile 'com.android.support:palette-v7:25.1.0'

加载不能在主线程中进行,加载方式有同步加载和异步加载两种:

  • 同步
//在加载图片的后台线程中同步加载
Palette palette = Palette.from(bitmap).genrate();
.
.
.
  • 异步
//异步加载
Palette.from(bitmap).genrate(new PaletteAsyncListener(){
    public void onGenerated(Palette p){
        .
        .
        .
    }
});

具体使用代码

这里使用 MvpDemo 中的部分代码,跟 Glide 配合起来使用的,其他辅助类代码直接 Demo 中查看。

//这是 Glide 加载状态的监听回调
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,
boolean isFromMemoryCache, boolean isFirstResource) {
    //获取到 Glide 加载图片的 Bitmap
    final Bitmap bitmap = GlideUtils.getBitmap(resource);
    //获取到24dp的长度
    final int twentyFourDip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                    24, ZhihuStoryInfoActivity.this.getResources().getDisplayMetrics());
    assert bitmap != null;
    Palette.from(bitmap)
            //设置构建 Palette 时使用的最大颜色数,风景景观推荐值在10-16,人脸图像色值增加到24
            .maximumColorCount(3)
            .clearFilters()
            .setRegion(0, 0, bitmap.getWidth() - 1, twentyFourDip)
            .generate(new Palette.PaletteAsyncListener() {
                @Override
                public void onGenerated(Palette palette) {
                    boolean isDark;
                    int lightness = ColorUtils.isDark(palette);
                    if (lightness == ColorUtils.LIGHTNESS_UNKNOWN) {
                        isDark = ColorUtils.isDark(bitmap, bitmap.getWidth() / 2, 0);
                    } else {
                        isDark = lightness == ColorUtils.IS_DARK;
                    }
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        int statusBarColor = getWindow().getStatusBarColor();
                        final Palette.Swatch topColor = ColorUtils.getMostPopulousSwatch(palette);
                        if (topColor != null && (isDark || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) {
                            statusBarColor = ColorUtils.scrimify(topColor.getRgb(), isDark, SCRIM_ADJUSTMENT);
                            if (!isDark && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                ViewUtils.setLightStatusBar(mStoryImg);
                            }
                        }
                        if (statusBarColor != getWindow().getStatusBarColor()) {
                            ValueAnimator statusBarColorAnim = ValueAnimator.ofArgb(
                                    getWindow().getStatusBarColor(), statusBarColor);
                            statusBarColorAnim
                                .addUpdateListener(new ValueAnimator
                                .AnimatorUpdateListener() {
                                    @Override
                                    public void onAnimationUpdate(ValueAnimator animation) {
                                        getWindow().setStatusBarColor((int) animation.getAnimatedValue());
                                    }
                                });
                                    //设置转换颜色的动画时间
                                    statusBarColorAnim.setDuration(1000L);
                                    statusBarColorAnim.setInterpolator(
                                            new AccelerateInterpolator());
                                    statusBarColorAnim.start();
                        }
                    }
                }
            });
}

最后

Demo地址

觉得本文对你有帮助

关注简书PandaQ404,持续分享中。。。
Github主页

相关文章

  • 主题颜色提取 ——— Palette

    Palette 调色板 Palette 是 Android L SDK 中的新特性。可以使用 Palette 从图...

  • 道长且阻 游仙且从容

    填坑Palette Palette的用法 传入Bitmap构建Palette 通过 Palette 提取需要的颜色...

  • Palette

    Android Palette Palette 可以从一张图片中提取颜色,我们可以把提取的颜色融入到App UI中...

  • 沉浸式设计之Palette应用

    Palette是一个类似调色板的工具类,根据传入的bitmap,提取出主题颜色,使得图片和颜色更加搭配,界面更加协...

  • MaterialDesign学习篇(六),调色板Palette的

    什么是Palette Palette的意思是调色板,它的作用是从图像中提取出突出的颜色,这样我们可以将提取出来的颜...

  • 此去经年 把酒赴长歌

    今晚太外,先挖个坑好了 Palette Palette 可以从一张 Bitmap 中提取出它突出的颜色 Suppo...

  • Palette

    Palette可以提取的颜色:Vibrant (有活力的)Vibrant dark(有活力的 暗色)Vibrant...

  • Android Material Design系列之Palett

    今天我们讲的这个Palette非常好用,也非常好玩。 Palette的作用是从图像中提取突出的颜色,这样我们可以根...

  • Android Material Design系列之Palett

    今天我们讲的这个Palette非常好用,也非常好玩。 Palette的作用是从图像中提取突出的颜色,这样我们可以根...

  • R中的颜色(转载)

    1. 基本颜色 1.1 palette() 1.1.1 palette的默认颜色 palette()## [1]"...

网友评论

    本文标题:主题颜色提取 ——— Palette

    本文链接:https://www.haomeiwen.com/subject/zizkbttx.html