Palette

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要異步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容