主題顏色提取 ——— Palette
Palette
調(diào)色板 Palette 是 Android L SDK 中的新特性。可以使用 Palette 從圖像中提取出突出的顏色(主色調(diào)),獲取到顏色之后我們再將這個顏色值賦給 ActionBar、狀態(tài)欄等。從而達到界面色調(diào)的統(tǒng)一,使界面美觀協(xié)調(diào)。
Palette 可以提取圖片中如下幾種特性的顏色:
- Vibrant (有活力的)
- Vibrant dark(有活力的 暗色調(diào))
- Vibrant light(有活力的 明亮)
- Muted (柔和的)
- Muted dark(柔和的 暗色調(diào))
- Muted light(柔和的 明亮)
內(nèi)部嵌套類
- Palette.Builder
生成器類,生成 Palette 實例。
- Palette.Filter
過濾器接口,使 Palette 有更加細膩的顏色過濾
- Palette.PaletteAsyncListener
異步加載監(jiān)聽
- pattle.Swatch
提供獲取結(jié)果的色彩樣本
所有的公共方法
返回值類型 | 方法及說明 |
---|---|
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) 返回一個柔和的暗色調(diào) rgb 值 |
Palette.Swatch | getDarkMutedSwatch() 返回一個柔和的暗色調(diào)樣本類 |
int | getDarkVibrantColor(int defaultColor) 返回一個鮮明的暗色調(diào) rgb 值 |
Palette.Swatch | getDarkVibrantSwatch() 返回一個鮮明的暗色調(diào)樣本類 |
int | getDomainColor(int defaultColor) 返回 Palette 中的主色調(diào) rgb值 |
Palette.Swatch | getDomainSwatch() 返回一個主色調(diào)的樣本類 |
int | getLightMutedColor(int defaultColor) 返回一個柔和的亮色調(diào)顏色 rgb |
Palette.Swatch | getLightMutedSwatch() 返回一個柔和的亮色調(diào)樣本類 |
int | getLightVibrantColor(int defaultColor) 返回一個鮮明的亮色調(diào) rgb |
Palette.Swatch | getLightVibrantSwatch() 返回一個鮮明的亮色調(diào)樣本類 |
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 加載狀態(tài)的監(jiān)聽回調(diào)@Overridepublic 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 時使用的最大顏色數(shù),風景景觀推薦值在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());
- }
- }); //設置轉(zhuǎn)換顏色的動畫時間
- statusBarColorAnim.setDuration(1000L);
- statusBarColorAnim.setInterpolator( new AccelerateInterpolator());
- statusBarColorAnim.start();
- }
- }
- }
- });
- }