通過 Palette 對象訪問圖片中的主要顏色以及疊加文本的相應顏色,並根據給定源圖片動態更改應用的配色方案。就是通過調色板獲取特定的顏色,然後就可以拿着這些顏色去做相應的應用設計,如圖片滑動時,應用的導航欄和系統狀態欄,跟着變色等等:
大概的使用方式:
public class MainActivity extends AppCompatActivity {
private ImageView mIV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIV = findViewById(R.id.after);
}
public void onChange(View view){
Palette.Builder builder = Palette.from(BitmapFactory.decodeResource(getResources(), R.mipmap.sunset));
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.colorPrimary)); //如果提取不到顏色樣本,就使用默認顏色
} else {
color = swatch.getRgb(); //如何提取到顏色樣本,就從顏色樣本中獲得顏色
}
int darkColor = colorBurn(color); //對顏色進行處理,使顏色更深
changeThemeColor(color, darkColor); //切換主題顏色
}
});
}
//獲得更深的顏色
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);
}
private void changeThemeColor(int color,int darkColor){
if (android.os.Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.setStatusBarColor(colorBurn(darkColor)); //設置系統欄顏色
window.setNavigationBarColor(colorBurn(darkColor)); //設置底部NavigationBar顏色
}
}
}
swatch 除了getRgb()方法獲取 RGB 顏色之外,還有其他獲取顏色的方法:
swatch.getPopulation(): //像素的數量
swatch.getRgb(): //RGB顏色
swatch.getHsl(): //HSL顏色
swatch.getBodyTextColor(): //用於內容正文文本的顏色
swatch.getTitleTextColor(): //標題文本的顏色