主題顏色提取 ——— Palette

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();
                        }
                    }
                }
            });
}

最后

Demo地址

覺(jué)得本文對(duì)你有幫助

關(guān)注簡(jiǎn)書(shū)PandaQ404,持續(xù)分享中。。。
Github主頁(yè)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容