5.X提出了color palette 的概念,能够让主题动态的去适应当前的页面色调,让整个app色调看起来比较和谐统一

那么如何使用Palette呢,必不可少,我们需要在Android studio中引用相关的jar包,我使用的jar是

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

第一:主要是通过传递一个Bitmap对象给Palette,我们可以使用Paltte下的方法,静态的方法Paltte.generate()或者Paltte.generateAsync(),我们可以看下源码

//generate(Bitmap) 生成含有16种颜色种类的Palette;
public static Palette generate(Bitmap bitmap) {
return generate(bitmap, DEFAULT_CALCULATE_NUMBER_COLORS);
}
//generate(Bitmap, int) 生成含有指定数量颜色种类的Palette,数量越多需要的时间越久。
public static Palette generate(Bitmap bitmap, int numColors) {
checkBitmapParam(bitmap);
checkNumberColorsParam(numColors);
// First we'll scale down the bitmap so it's shortest dimension is 100px
final Bitmap scaledBitmap = scaleBitmapDown(bitmap);
// Now generate a quantizer from the Bitmap
ColorCutQuantizer quantizer = ColorCutQuantizer.fromBitmap(scaledBitmap, numColors);
// If created a new bitmap, recycle it
if (scaledBitmap != bitmap) {
scaledBitmap.recycle();
}
// Now return a ColorExtractor instance
return new Palette(quantizer.getQuantizedColors());
}
public static AsyncTask<Bitmap, Void, Palette> generateAsync(
Bitmap bitmap, PaletteAsyncListener listener) {
return generateAsync(bitmap, DEFAULT_CALCULATE_NUMBER_COLORS, listener);
}
public static AsyncTask<Bitmap, Void, Palette> generateAsync(
final Bitmap bitmap, final int numColors, final PaletteAsyncListener listener) {
checkBitmapParam(bitmap);
checkNumberColorsParam(numColors);
checkAsyncListenerParam(listener); return AsyncTaskCompat.executeParallel(
new AsyncTask<Bitmap, Void, Palette>() {
@Override
protected Palette doInBackground(Bitmap... params) {
return generate(params[], numColors);
} @Override
protected void onPostExecute(Palette colorExtractor) {
listener.onGenerated(colorExtractor);
}
}, bitmap);
}

2. 由于Android 对bitmap的操作可能是好事操作,我们可以选择使用Palette.generateAsync()的方法.他比Palette.generate()的区别就是需要传入PaletteAsyncListener

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView mIv=(ImageView)findViewById(R.id.iv ); Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.splash);
mIv.setImageBitmap(bitmap);
Palette.generateAsync(bitmap,new Palette.PaletteAsyncListener(){ @Override
public void onGenerated(Palette palette) {
//通过palette来获取对应的色调
Palette.Swatch vibrant=palette.getLightVibrantSwatch();
//int vibrant=palette.getMutedColor(990000);
//将颜色设置给相应的组件,比如actionbar,状态栏
getActionBar().setBackgroundDrawable(new ColorDrawable(vibrant.getRgb()));
//getActionBar().setBackgroundDrawable(new ColorDrawable(vibrant));
Window window =getWindow();
window.setStatusBarColor(vibrant.getRgb());
// window.setStatusBarColor(vibrant);
}
});
}

3.Palette默认情况会解析出来16种颜色,但是我们常用的无非就6种:

//获取鲜艳的颜色
public int getVibrantColor(int defaultColor) {
return mVibrantSwatch != null ? mVibrantSwatch.getRgb() : defaultColor;
}
//获取鲜艳颜色中的亮颜色
public int getLightVibrantColor(int defaultColor) {
return mLightVibrantSwatch != null ? mLightVibrantSwatch.getRgb() : defaultColor;
}
//获取鲜艳颜色中的暗色
public int getDarkVibrantColor(int defaultColor) {
return mDarkVibrantSwatch != null ? mDarkVibrantSwatch.getRgb() : defaultColor;
}

//获取柔和的颜色
public int getMutedColor(int defaultColor) {
return mMutedSwatch != null ? mMutedSwatch.getRgb() : defaultColor;
}
//获取柔和色中的亮颜色
public int getLightMutedColor(int defaultColor) {
return mLightMutedColor != null ? mLightMutedColor.getRgb() : defaultColor;
}
//获取柔和颜色中的暗色
public int getDarkMutedColor(int defaultColor) {
return mDarkMutedSwatch != null ? mDarkMutedSwatch.getRgb() : defaultColor;
}

我们看下效果图:

上图1部分代码表示:
Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.mipmap.banner_pingan_default);
mIv.setImageBitmap(bitmap);
Palette palette = Palette.generate(bitmap);
int vibrant = palette.getVibrantColor();//个人试了一下,好像这个颜色数字没多大用。。。。
int vibrantLight = palette.getLightVibrantColor();
int vibrantDark = palette.getDarkVibrantColor();
int muted = palette.getMutedColor();
int mutedLight = palette.getLightMutedColor();
int mutedDark = palette.getDarkMutedColor();
上图2部分代码表示:
Palette.generateAsync(bitmap,new Palette.PaletteAsyncListener(){
@Override
public void onGenerated(Palette palette) {
//通过palette来获取对应的色调
Palette.Swatch vibrant=palette.getLightVibrantSwatch();
//int vibrant=palette.getMutedColor(990000);
//将颜色设置给相应的组件
getActionBar().setBackgroundDrawable(new ColorDrawable(vibrant.getRgb()));
//getActionBar().setBackgroundDrawable(new ColorDrawable(vibrant));
Window window =getWindow();
window.setStatusBarColor(vibrant.getRgb());
// window.setStatusBarColor(vibrant);
}
});
}

4.Palette获取相应的颜色另一种方式 使用swatch:palette解析来的颜色都有对应swatch,它里面包含了很多颜色信息,常用的获取颜色有以下几几种

    public Swatch getVibrantSwatch() {
return mVibrantSwatch;
} /**
* Returns a light and vibrant swatch from the palette. Might be null.
*/
public Swatch getLightVibrantSwatch() {
return mLightVibrantSwatch;
} /**
* Returns a dark and vibrant swatch from the palette. Might be null.
*/
public Swatch getDarkVibrantSwatch() {
return mDarkVibrantSwatch;
} /**
* Returns a muted swatch from the palette. Might be null.
*/
public Swatch getMutedSwatch() {
return mMutedSwatch;
} /**
* Returns a muted and light swatch from the palette. Might be null.
*/
public Swatch getLightMutedSwatch() {
return mLightMutedColor;
} /**
* Returns a muted and dark swatch from the palette. Might be null.
*/
public Swatch getDarkMutedSwatch() {
return mDarkMutedSwatch;
}

你可以从Swatch里面获取你需要的颜色信息,比如RGB颜色值、HSL颜色向量、对应颜色在图像中所占的比例、与对应颜色搭配的标题字体颜色和正文字体颜色。

Palette palette  = Palette.generate(bitmap);
Palette.Swatch swatch = palette.getVibrantSwatch();
//hsl颜色向量
float[] hslValues = swatch.getHsl();
//rgb颜色值
int rgbColor = swatch.getRgb();
//该颜色在图像中所占的像素数
int pixelCount = swatch.getPopulation();
//对应的标题字体颜色
int titleTextColor = swatch.getTitleTextColor();
//对应的正文字体颜色
int bodyTextColor = swatch.getBodyTextColor();

在这里要注意的是,如果想要使用swatch获取的颜色,不能像上面直接使用get方法,他不需要传入默认的颜色值,如下例子:

通过palette来获取对应的色调
Palette.Swatch vibrant=palette.getLightVibrantSwatch();

 不知道大家有没有注意到源码中这一句话,他的意思说如果Palette没有解析到swatch的话,就会返回一个null。

 /**
* Returns a light and vibrant swatch from the palette. Might be null.
*/

5.在源码中还有这样一个方法:获取所有的颜色(16种),返回的是一个list集合


/**
* Returns all of the swatches which make up the palette.
*/
public List<Swatch> getSwatches() {
return Collections.unmodifiableList(mSwatches);
}

 效果图:

代码实现:

 List<Palette.Swatch> swatchs=Palette.generate(bitmap).getSwatches();
for (int i=;i<swatchs.size();i++){
View view = new View(MainActivity.this);
view.setBackgroundColor(swatchs.get(i).getRgb());
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,));
mLinearLayout.addView(view);
}
 

 

  

  


  

如何使用Palette提取Bitmap的颜色的更多相关文章

  1. C#读写BitMap及颜色相乘

    C#读写BitMap及颜色相乘 private Bitmap ReadBitMapAndMultipy(Bitmap bitmap0) { int x1width = bitmap0.Width; i ...

  2. LIRe 源代码分析 5:提取特征向量[以颜色布局为例]

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  3. php 提取图片主要颜色

    PHP实现获取图片颜色值的方法 PHP获取图片颜色值检测图片主要颜色是通过imagecreatefromjpeg函数读取图片,再循环获得各个颜色值加以计算实现的. /** * 获取图片主要颜色 * @ ...

  4. 使用 Palette 让你的 UI 色彩与内容更贴合

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章. 未经允许,不得转载. 一.前言 今天介绍一个 An ...

  5. Palette 的使用

    Palette有什么用? Palette主要功能就是可以从图片中提取各种与颜色有关的元素.通过使用 Palette ,我们可以很轻松的实现界面风格的统一. Palette的使用很简单,首先你可以从gi ...

  6. [转]AppCompat 22.1,Goole暴走,MD全面兼容低版本

    AppCompat 22.1,Goole暴走,MD全面兼容低版本 分类: Android2015-04-24 09:48 1354人阅读 评论(0) 收藏 举报 android   目录(?)[+] ...

  7. Android开发学习之路-Palette颜色提取工具类使用

    视频(要FQ):https://www.youtube.com/watch?v=5u0dtzXL3PQ Palette是一个在support-v7包中的一个颜色提取工具类,用法比较简单,而且是谷歌官方 ...

  8. Android Material Design NavigationView 及 Palette 颜色提取器

    DrawerLayout + NavigationView DrawerLayout布局,通常在里面添加两个子控件,程序主界面添加到NavitagionView前面. <android.supp ...

  9. Palette状态栏颜色提取,写的不错就分享了

    Palette 说Palette之前先说下前面提到的Pager.ViewPager是什么大家应该都是知道的了,一般ViewPager.xxxTabStrip.Fragment三个好基友是一起出现的.这 ...

随机推荐

  1. java enum的用法

    原始的常量定义: public static fianl MON=“Mon”; public static final TUE="Tue"; 语法(定义) 创建枚举类型要使用 en ...

  2. JQuery easyui (4)Tooltip (提示组件) 组件

    ps:先来一波美图 Tooltip的加载方式: 1,class加载 <a href="#" title="tooltip">hello word&l ...

  3. javascript 常用函数

    //获取元素的样式值. function getStyle(elem,name){ if(elem.style[name]){ return elem.style[name]; }else if(el ...

  4. Ajax中send方法的使用

    Ajax中send方法参数的使用 一般情况下,使用Ajax提交的参数多是些简单的字符串,可以直接使用GET方法将要提交的参数写到open方法的url参数中,此时send方法的参数为null. 例如 : ...

  5. Linux SSH 互信

    第一步: 创建用于身份认证的两个密钥文件 ssh-keygen #注明.想省事的话打完这个命令后一直回车就行了. 第二步: 把公钥上传到目标主机上去 ssh-copy-id -i id_rsa.pub ...

  6. Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口

    Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口.Surface UEFI 提供新功能,如启动更快速.安全性更高.可替换 ...

  7. JS中String添加trim()方法

    这么牛的JS竟然还要自己封装trim方法. 下面利用prototype和正则表达式的添加方式添加trim(): <script language="javascript"&g ...

  8. SendMessage的返回值,就是由相应的响应消息函数的返回值(解释的简洁明了)

    SendMessage Return Values The return value specifies the result of the message processing and depend ...

  9. 服务没有mysql

    你安装了mysql没有,没有就先安装,安装好mysql以后,在bin目录下有个mysqld.exe,运行这个程序就可以添加mysql服务,但是运行这个程序需要使用参数,否则就会以命令行窗口形式启动MY ...

  10. 关于ajax中async参数的感悟

    async,这个参数默认为true. 就是异步去处理信息. 当把它设置为false的时候,就是同步去处理数据了. var current_lead_id = '<?php echo $curre ...