通过 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(): //标题文本的颜色