Palette 單詞本意是調(diào)色板的意思,所以在Android中Palette肯定會與顏色有關(guān),它在作用是根據(jù)當前圖片的Bitmap來獲取到當前圖片的主色調(diào),從而我們可以去改變主題背景的顏色和字體的顏色達到界面色調(diào)統(tǒng)一,使界面美觀協(xié)調(diào)。
Palette可以提取的顏色和提取方法如下:
- Vibrant------------getVibrantSwatch()-------------充滿活力的
- VibrantDark------getDarkVibrantSwatch()------充滿活力的暗色
- VibrantLight------getLightVibrantSwatch()------充滿活力的亮色
- Muted--------------getMutedSwatch()--------------柔和的
- MutedDark--------getDarkMutedSwatch()-------柔和的暗色
- MutedLight--------getLightMutedSwatch()-------柔和的亮色
Palette類中嵌套了一個Swatch類,是用來獲取調(diào)色板色彩樣本的,比如:
private Palette.Swatch s1;
s1 = palette.getVibrantSwatch();
Swatch總共有5中方法:
getPopulation(): //獲取當前顏色樣本的色素數(shù)目
getRgb(): //獲取當前顏色樣本的RGB值
getHsl(): //獲取當前顏色樣本的Hsl值
getBodyTextColor(): // 適合該顏色樣本的主體文字的顏色值
getTitleTextColor(): // 適合該顏色樣本的標題文字的顏色值
Palette是通過Builder方法去創(chuàng)建Palette對象的,具體方法是
Palette.Builder(Bitmap).generate(PaletteAsyncListener)
其中第一個參數(shù)就是需要獲取色素的圖片的Bitmap,第二個參數(shù)就是一個Paletee類中的方法PaletteAsyncListener(),一般情況我們都會在里面new一個這個方法,讓它自動生成onGenerated()方法。
new Palette.Builder(BitmapFactory.decodeResource(getResources(), imageId))
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
}
});
在這個onGenerated()方法中我們?nèi)カ@取到當前的6種顏色樣本,從這個方法的名字Async(PaletteAsyncListener)就可以看得出來這個方法本來就是異步的,所以在我們獲取到了6中顏色樣本之后,就可以在這個方法里面進行UI的色彩賦值了。
new Palette.Builder(BitmapFactory.decodeResource(getResources(), imageId))
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
s1 = palette.getVibrantSwatch();
Log.d("XXX", String.valueOf(s1));
s2 = palette.getDarkVibrantSwatch();
s3 = palette.getLightVibrantSwatch();
s4 = palette.getMutedSwatch();
s5 = palette.getDarkMutedSwatch();
s6 = palette.getLightMutedSwatch();
if (s1 != null) {
iv1.setBackgroundColor(s1.getRgb());
s1.getPopulation();
}
if (s2 != null) {
iv2.setBackgroundColor(s2.getRgb());
}
if (s3 != null) {
iv3.setBackgroundColor(s3.getRgb());
}
if (s4 != null) {
iv4.setBackgroundColor(s4.getRgb());
}
if (s5 != null) {
iv5.setBackgroundColor(s5.getRgb());
}
if (s6 != null) {
iv6.setBackgroundColor(s6.getRgb());
}
}
});
我們會注意到在給s1-s6獲取顏色完畢之后,我們在進行編輯色彩的時候,還是要去給它們判斷一下是否為空,在這里我們必須去判斷一下是否為空,因為如果面板無法找到相匹配的標準色,那么它就會返回為null,這樣會導(dǎo)致空指針異常。
順帶提一下,Palette類本來的構(gòu)造方法為
Palette p = Palette.generate(bitmap);//默認調(diào)色板色素大小為16
Palette p = Palette.generate(bitmap,24);//指定調(diào)色板色素的大小
異步為
Palette p = Palette.generateAsync(bitmap);
Palette p = Palette.generateAsync(bitmap,24);
現(xiàn)在已經(jīng)被棄用。
Palette類需要傳入當前圖片的Bitmap,所以我們就需要獲取到圖片的Bitmap。獲取本地圖片Bitmap的方法為:
BitmapFactory.decodeResource(getResources(), imageId)
imageId中傳入的就是這個圖片所在的文件,例如R.mipmap.ic_launcher。
獲取網(wǎng)絡(luò)圖片的Bitmap使用代碼中寫的getBitmap方法:
Bitmap bitmap =getBitmap(urlPath);
傳入的參數(shù)就是String類型的圖片網(wǎng)址,切記獲取網(wǎng)絡(luò)圖片Bitmap要異步。