什么是Palette
Palette的意思是調色板除秀,它的作用是從圖像中提取出突出的顏色,這樣我們可以將提取出來的顏色賦給狀態(tài)欄各薇、Toolbar项贺、標題欄等,使得整個界面看起來色調統(tǒng)一峭判,UI風格更加美觀和融洽开缎。
看下效果:
可以看到,下面的6個條塊的顏色是從圖片中提取出來的林螃,Palette可以提取的顏色有:
- VibrantColor(有活力的顏色)
- LightVibrantColor(有活力的 亮色)
- DarkVibrantColor(有活力的 暗色)
- MutedColor(柔和的顏色)
- LightMutedColor(柔和的 亮色)
- DarkMutedColor(柔和的 暗色)
如何使用Palette提取顏色
1.導入依賴
compile 'com.android.support:palette-v7:26.0.0-alpha1'
2.調用Palette提供的API
public void pickPicColors() {
Bitmap bitmap = ((BitmapDrawable) mIvPic.getDrawable()).getBitmap();
Palette.Builder builder = Palette.from(bitmap);
builder.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
//提取有活力的顏色
int vibrantColor = palette.getVibrantColor(Color.RED);
mTvVibrant.setBackgroundColor(vibrantColor);
//提取有活力的 亮色
int lightVibrantColor = palette.getLightVibrantColor(Color.RED);
mTvLightVibrant.setBackgroundColor(lightVibrantColor);
//提取有活力的 暗色
int darkVibrantColor = palette.getDarkVibrantColor(Color.RED);
mTvDarkVibrant.setBackgroundColor(darkVibrantColor);
//提取柔和的顏色
int mutedColor = palette.getMutedColor(Color.RED);
mTvMuted.setBackgroundColor(mutedColor);
//提取柔和的亮色
int lightMutedColor = palette.getLightMutedColor(Color.RED);
mTvLightMuted.setBackgroundColor(lightMutedColor);
//提取柔和的暗色
int darkMutedColor = palette.getDarkMutedColor(Color.RED);
mTvDarkMuted.setBackgroundColor(darkMutedColor);
}
});
}
通過調用Palette.from()得到Palette.Builder對象奕删,從以往經驗可以知道,相關的一些配置可以調用Builder中的一些方法進行配置,這里并沒有對Builder進行配置疗认,只是使用默認的配置完残。
通過調用builder的generate方法分析圖片,得到Palette對象横漏,這里傳入了一個Listener谨设,該方法屬于異步執(zhí)行的方法,因為分析圖像顏色需要時間缎浇,如果圖片中顏色多樣而且復雜扎拣,分析所消耗的事件也會越長,所以是通過接口回調分析完畢的結果素跺。
得到Palette對象后二蓝,我們就可以通過它獲取到6種色調,由于不一定能夠提取到對應的色調,所以在調用每種方法的時候需要傳入一個默認的顏色指厌,這里使用了Color.RED刊愚,如果提取不到對應的顏色,則是用紅色來代替踩验。
獲取Swatch(樣本)
Palette除了可以獲取到上面提到的6中色調外鸥诽,還可以獲取到對應的Swatch對象商玫,Swatch是樣本的意思,Swatch樣本對象中衙传,可以獲取色調的RGB顏色决帖,HSL顏色,像素的數(shù)量等蓖捶,同時,還提供了相當牛逼的方法扁远,getTitleTextColor()和getBodyTextColor()俊鱼,獲取適合作為圖片上方標題和內容文字的顏色。
獲取6種色調的樣本
Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();//獲取有活力的顏色樣本
Palette.Swatch lightVibrantSwatch = palette.getLightVibrantSwatch();//獲取有活力 亮色的樣本
Palette.Swatch drakVibrantSwatch = palette.getDarkVibrantSwatch();//獲取有活力 暗色的樣本
Palette.Swatch mutedSwatch = palette.getMutedSwatch();//獲取柔和的顏色樣本
Palette.Swatch lightMutedSwatch = palette.getLightMutedSwatch();//獲取柔和 亮色的樣本
Palette.Swatch darkMutedSwatch = palette.getDarkMutedSwatch();//獲取柔和 暗色的樣本
樣本對象的一些API
int rgb = vibrantSwatch.getRgb();//獲取對應樣本的rgb
float[] hsl = vibrantSwatch.getHsl();//獲取hsl顏色
int population = vibrantSwatch.getPopulation();//獲取像素的數(shù)量
int titleTextColor = vibrantSwatch.getTitleTextColor();//獲取適合標題文字的顏色
int bodyTextColor = vibrantSwatch.getBodyTextColor();//獲取適配內容文字的顏色
獲取適合標題文字和內容文字顏色的效果:
代碼:
//獲取有活力 暗色的樣本
Palette.Swatch vibrantSwatch = palette.getDarkVibrantSwatch();
//獲取適合標題文字的顏色
int titleTextColor = vibrantSwatch.getTitleTextColor();
mTvTitle.setTextColor(titleTextColor);
//獲取適合內容文字的顏色
int bodyTextColor = vibrantSwatch.getBodyTextColor();
mTvBody.setTextColor(bodyTextColor);
這里我們獲取有活力 暗色的樣本畅买,通過樣本對象獲取適配標題文字的顏色和適配內容文字的顏色并闲,設置給展示標題和內容的TextView,為了更容易看出文本的顏色,兩個TextView均設置了半透明的背景色谷羞。
使用Palette實戰(zhàn)
上面提到帝火,Palette是為了提取圖片的顏色,用于為狀態(tài)欄湃缎、Toolbar犀填、標題欄趙色,統(tǒng)一App的顏色嗓违,使得整個App風格美觀和融洽九巡,接下來我們將使用Palette來實現(xiàn)App顏色的同一,提取圖片的顏色來修改狀態(tài)欄和Toolbar的顏色蹂季。
看下效果:
當切換fragment的時候冕广,狀態(tài)欄、Toolbar偿洁、Tablayout的顏色都跟著變換撒汉,顏色值的RGB是提取圖片的樣本。
主要的代碼是:
/**
* 改變各部分的顏色
* @param position 下標
*/
private void changeColor(int position) {
// 用來提取顏色的Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),mImgResources[position]);
// Palette的部分
Palette.Builder builder = Palette.from(bitmap);
builder.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
//獲取到充滿活力的樣本
Palette.Swatch vibrant = palette.getVibrantSwatch();
// 如果是android5.0或以上涕滋,將顏色設置給狀態(tài)欄
if (android.os.Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.setStatusBarColor(deepenColor(vibrant.getRgb()));//設置狀態(tài)欄的顏色睬辐,設置顏色之前對顏色進行加深處理
window.setNavigationBarColor(deepenColor(vibrant.getRgb()));//設置導航欄的顏色,設置顏色之前對顏色進行加深處理
}
mToolbar.setBackgroundColor(vibrant.getRgb());//設置Toolbar背景色
mTabLayout.setBackgroundColor(vibrant.getRgb());//設置TabLayout背景色
mTabLayout.setSelectedTabIndicatorColor(deepenColor(vibrant.getRgb()));//設置TabLayout指示器的顏色
}
});
}
當頁面變化的時候調用changeColor()方法進行顏色的改變
/**
* 改變各部分的顏色
* @param position 下標
*/
private void changeColor(final int position) {
Palette.Swatch swatch = mSwatchMap.get(position);
if (swatch != null){
setColor(swatch);//設置顏色
return;
}
// 用來提取顏色的Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),mImgResources[position]);
// Palette的部分
Palette.Builder builder = Palette.from(bitmap);
builder.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
//獲取到充滿活力的樣本
Palette.Swatch vibrant = palette.getVibrantSwatch();
setColor(vibrant);//設置顏色
mSwatchMap.put(position,vibrant);//保存對應位置的樣本對象
}
});
}
當?shù)谝淮畏治鰣D片的時候何吝,會獲取到充滿活力的樣本溉委,將其用HasMap保存起來,如果已經分析過就直接從Map中獲取到爱榕,不需要再次分析瓣喊,提高效率,其中setColor()方法是給狀態(tài)欄黔酥、Toolbar藻三、TabLayout等設置背景色:
/**
* 設置顏色
* @param vibrant
*/
private void setColor(Palette.Swatch vibrant) {
// 將顏色設置給狀態(tài)欄
if (android.os.Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.setStatusBarColor(deepenColor(vibrant.getRgb()));//設置狀態(tài)欄的顏色洪橘,設置顏色之前對顏色進行加深處理
window.setNavigationBarColor(deepenColor(vibrant.getRgb()));//設置導航欄的顏色,設置顏色之前對顏色進行加深處理
}
mToolbar.setBackgroundColor(vibrant.getRgb());//設置Toolbar背景色
mTabLayout.setBackgroundColor(vibrant.getRgb());//設置TabLayout背景色
mTabLayout.setSelectedTabIndicatorColor(deepenColor(vibrant.getRgb()));//設置TabLayout指示器的顏色
}
其中狀態(tài)欄和導航欄設置背景顏色之前棵帽,需要對顏色進行加深處理熄求,這樣看起來會更加美觀,加深顏色的方法是deepenColor():
/**
* 對顏色進行加深處理
*
* @return
*/
private int deepenColor(int RGBValues) {
int alpha = RGBValues >> 24;
int red = RGBValues >> 16 & 0xFF;
int green = RGBValues >> 8 & 0xFF;
int blue = RGBValues & 0xFF;
red = (int) Math.floor(red * (1 - 0.1));
green = (int) Math.floor(green * (1 - 0.1));
blue = (int) Math.floor(blue * (1 - 0.1));
return Color.rgb(red, green, blue);
}
顏色的十六進制逗概,從左到右每兩個字母分別代表alpha(透明度)弟晚、RED(紅)、GREEN(綠)逾苫、BLUE(藍),用移位的方法可以得到每種顏色的值卿城,然后每種顏色值減小一下,在合成RGB顏色铅搓,顏色就會看起來深一些了
到這里我們基本掌握了調色板Palette的使用瑟押,想看源碼的可以查看: