Palette
調(diào)色板 Palette 是 Android L SDK 中的新特性??梢允褂?Palette 從圖像中提取出突出的顏色(主色調(diào)),獲取到顏色之后我們?cè)賹⑦@個(gè)顏色值賦給 ActionBar、狀態(tài)欄等。從而達(dá)到界面色調(diào)的統(tǒng)一,使界面美觀協(xié)調(diào)。
Palette 可以提取圖片中如下幾種特性的顏色:
- Vibrant (有活力的)
- Vibrant dark(有活力的 暗色調(diào))
- Vibrant light(有活力的 明亮)
- Muted (柔和的)
- Muted dark(柔和的 暗色調(diào))
- Muted light(柔和的 明亮)
內(nèi)部嵌套類(lèi)
- Palette.Builder
生成器類(lèi),生成 Palette 實(shí)例。 - Palette.Filter
過(guò)濾器接口,使 Palette 有更加細(xì)膩的顏色過(guò)濾 - Palette.PaletteAsyncListener
異步加載監(jiān)聽(tīng) - pattle.Swatch
提供獲取結(jié)果的色彩樣本
所有的公共方法
| 返回值類(lèi)型 | 方法及說(shuō)明 |
|---|---|
| static Palette | from(List<Palette.Switch> switches) 通過(guò)預(yù)設(shè)的 Palette.Swatch 顏色樣本列表 來(lái)生成 Palette |
| static Palette.Builder | from(Bitmap bitmap) 通過(guò)返回 Palette.Builder 實(shí)例來(lái)構(gòu)建 Palette |
| static Palette | generate(Bitmap bitmap,int numColors) 該方法已被遺棄,建議用 Palette.Builder 來(lái)生成Palette |
| static Palette | generate(Bitmap bitmap) 該方法已被遺棄,建議用 Palette.Builder 來(lái)生成Palette |
| static AsyncTask<Bitmap,Void,Palette> | generateAsync(Bitmap bitmap,int numColor,Palette.PaletteAsyncListener listener) 該方法已被遺棄,建議用 Palette.Builder 來(lái)生成Palette |
| static AsyncTask<Bitmap,Void,Palette> | generateAsync(Bitmap bitmap,Palette.PaletteAsyncListener listener) 該方法已被遺棄,建議用 Palette.Builder 來(lái)生成Palette |
| int | getColorForTarget(Target target,int defaultColor) 返回一個(gè)從目標(biāo)獲取的的 rgb 色值 |
| int | getDarkMutedColor(int defaultColor) 返回一個(gè)柔和的暗色調(diào) rgb 值 |
| Palette.Swatch | getDarkMutedSwatch() 返回一個(gè)柔和的暗色調(diào)樣本類(lèi) |
| int | getDarkVibrantColor(int defaultColor) 返回一個(gè)鮮明的暗色調(diào) rgb 值 |
| Palette.Swatch | getDarkVibrantSwatch() 返回一個(gè)鮮明的暗色調(diào)樣本類(lèi) |
| int | getDomainColor(int defaultColor) 返回 Palette 中的主色調(diào) rgb值 |
| Palette.Swatch | getDomainSwatch() 返回一個(gè)主色調(diào)的樣本類(lèi) |
| int | getLightMutedColor(int defaultColor) 返回一個(gè)柔和的亮色調(diào)顏色 rgb |
| Palette.Swatch | getLightMutedSwatch() 返回一個(gè)柔和的亮色調(diào)樣本類(lèi) |
| int | getLightVibrantColor(int defaultColor) 返回一個(gè)鮮明的亮色調(diào) rgb |
| Palette.Swatch | getLightVibrantSwatch() 返回一個(gè)鮮明的亮色調(diào)樣本類(lèi) |
| int | getMutedColor(int defaultColor) 返回一個(gè)柔和的顏色 rgb |
| Palette.Swatch | getMutedSwatch() 返回一個(gè)柔和的顏色樣本類(lèi) |
| Palette.Swatch | getSwatchForTarget(Target target) 為給定的目標(biāo)從 Palette 中返回一個(gè)選中樣本,如果未找到則返回空 |
| List<Palette.Swatch> | getSwatches() 獲取所有用在Palette中的Swatch樣本類(lèi) |
| List<Target> | getTargets() 獲取所有構(gòu)造 Palette 的 Target |
| int | getVibrantColor(int defaultColor) 獲取一個(gè)鮮明的顏色 rgb |
| Palette.Swatch | getVibrantSwatch() 獲取一個(gè)鮮明的樣本類(lèi) |
使用方式
使用 Palette 需先引入 Palette 的 support 資源包:
compile 'com.android.support:palette-v7:25.1.0'
加載不能在主線程中進(jìn)行,加載方式有同步加載和異步加載兩種:
- 同步
//在加載圖片的后臺(tái)線程中同步加載
Palette palette = Palette.from(bitmap).genrate();
.
.
.
- 異步
//異步加載
Palette.from(bitmap).genrate(new PaletteAsyncListener(){
public void onGenerated(Palette p){
.
.
.
}
});
具體使用代碼
這里使用 MvpDemo 中的部分代碼,跟 Glide 配合起來(lái)使用的,其他輔助類(lèi)代碼直接 Demo 中查看。
//這是 Glide 加載狀態(tài)的監(jiān)聽(tīng)回調(diào)
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,
boolean isFromMemoryCache, boolean isFirstResource) {
//獲取到 Glide 加載圖片的 Bitmap
final Bitmap bitmap = GlideUtils.getBitmap(resource);
//獲取到24dp的長(zhǎng)度
final int twentyFourDip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
24, ZhihuStoryInfoActivity.this.getResources().getDisplayMetrics());
assert bitmap != null;
Palette.from(bitmap)
//設(shè)置構(gòu)建 Palette 時(shí)使用的最大顏色數(shù),風(fēng)景景觀推薦值在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());
}
});
//設(shè)置轉(zhuǎn)換顏色的動(dòng)畫(huà)時(shí)間
statusBarColorAnim.setDuration(1000L);
statusBarColorAnim.setInterpolator(
new AccelerateInterpolator());
statusBarColorAnim.start();
}
}
}
});
}
最后
覺(jué)得本文對(duì)你有幫助
關(guān)注簡(jiǎn)書(shū)PandaQ404,持續(xù)分享中。。。
Github主頁(yè)