Palette 的使用


Palette有什么用?

Palette主要功能就是可以從圖片中提取各種與顏色有關的元素。通過使用 Palette ,我們可以很輕松的實現界面風格的統一。

 

Palette的使用很簡單,首先你可以從github上添加 palette 的依賴

compile 'com.android.support:palette-v7:26.0.0-alpha1'

或者直接右鍵你的項目,在OpenmoduleSetting->dependenecies->LibraryDependency 中直接搜索添加 Palette 。

然后你就可以在代碼中使用 Palette 了

具體使用如下:

        Palette.Builder builder = Palette.from(BitmapFactory.decodeResource(getResources(), R.drawable.xxx));
        builder.generate(new Palette.PaletteAsyncListener() {
            @Override
            public void onGenerated(Palette palette) {

//                Palette.Swatch swatch = palette.getVibrantSwatch();  //充滿活力的色調
//                Palette.Swatch swatch = palette.getLightVibrantSwatch();  //充滿活力的亮色調
//                Palette.Swatch swatch = palette.getDarkVibrantSwatch();  //充滿活力的暗色調

//                Palette.Swatch swatch = palette.getMutedSwatch();  //柔和的色調
//                Palette.Swatch swatch = palette.getLightMutedSwatch();  //柔和的亮色調
//                Palette.Swatch swatch = palette.getDarkMutedSwatch();  //柔和的暗色調
//
                int color;
                Palette.Swatch swatch = palette.getDominantSwatch();
                if (swatch == null) {
                    color = palette.getDominantColor(getResources().getColor(R.color.colorTheme));  //如果提取不到顏色樣本,就使用默認顏色
                } else {
                    color = swatch.getRgb();   //如何提取到顏色樣本,就從顏色樣本中獲得顏色
                }
                int darkColor = colorBurn(color);  //對顏色進行處理,使顏色更深
                changeThemeColor(color, darkColor);  //切換主題顏色
            }
        });

該方法是通過異步的方式獲得顏色,先通過 Palette.from(Bitmap)傳入圖片,當 Palette 提取好圖片顏色后就會調用 onGenerated(Palette)方法,該方法會傳入一個 Palette對象,我們在該方法中對該 Palette 進行一系列操作。

一個 Palette 對象中會保存着該圖片的好幾種顏色樣本,通過上面的代碼你可以看到顏色樣本的分類。

我們可以通過 palette.getxxxSwatch()方法得到不同的顏色樣本(swatch),然后再調用 swatch.getRgb()就可以得到每個樣本(swatch)中對應的 RGB 顏色。不同樣本獲取到的RGB顏色也各不相同,具體的效果你可以自己去試。這里需要注意的是,由於不同圖片的顏色不同,有些圖片會出現某些 swatch 對象獲取不到的狀況,如果不做處理就會報空指針錯誤,並且提取不到顏色。我們可以通過 palette.getxxxColor(int)方法來設置默認的顏色,當 swatch 提取不到顏色時就使用該顏色。

 

上述代碼中獲取顏色之后,又調用了colorBurn(int)方法,用來對獲取到的顏色進行深色處理。因為一般系統狀態欄的顏色都會比界面中的顏色要深一些,所以我們可以通過該方法獲取到更深的顏色給系統狀態欄。該方法具體實現如下:

    //獲得更深的顏色
    private int colorBurn(int color) {
        int alpha = color >> 24;
        int red = color >> 16 & 0xFF;
        int green = color >> 8 & 0xFF;
        int blue = color & 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);
    }

獲取到顏色后,你就可以給想要設置顏色的控件進行上色了。

如果你想要給系統狀態欄和底部的 NavigationBar 上色,可以這樣寫:

        if (android.os.Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.setStatusBarColor(colorBurn(color));  //設置系統欄顏色
            window.setNavigationBarColor(colorBurn(color));  //設置底部NavigationBar顏色
        }

 

另外再補充說一下swatch 中的一些方法。swatch 除了getRgb()方法獲取 RGB 顏色之外,還有其他獲取顏色的方法,具體如下:

swatch.getPopulation():  //像素的數量
swatch.getRgb():  //RGB顏色
swatch.getHsl():  //HSL顏色
swatch.getBodyTextColor():  //用於內容正文文本的顏色
swatch.getTitleTextColor():  //標題文本的顏色


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM