情况描述:市面上很多的App,在展示头部的时候会采用用户传输的图片进行高斯模糊处理,然后设置成背景,这上面再展示其他的信息,例如,姓名,签名,编辑之类的操作按钮。
问题:但是字体颜色你是设置为白色,还是黑色呢?我设置一个黑色头像,你显示白色字体,没毛病。那我如果设置的是个白色头像,那字体如果仍为白色,用户就根本看不到字了。很显然体验感非常差。
如何解决?
采用RGB取色,对背景色进行分析,如果背景为深色,则字体颜色为浅色;若背景为浅色,则字体为深色。
效果图:
当图片为浅色时,字体为深色
当底色为深色时,字体颜色为浅色
看了效果之后,开始动手
1.获取背景图为深色还是浅色
getBitmapPixColor(Bitmap src):返回 true 图片为浅色;false为深色
/**
* 判断图片颜色是深色还是浅色
* @param src
* @return true 图片为浅色
*/
public static boolean getBitmapPixColor(Bitmap src) {
if (null == src) {
return false;
}
int R = 0, G = 0, B = 0;
int pixelColor;
int height = src.getHeight();
int width = src.getWidth();
//获取RGB值
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
pixelColor = src.getPixel(x, y);
R = Color.red(pixelColor);
G = Color.green(pixelColor);
B = Color.blue(pixelColor);
}
}
//将获取的RGB值进行计算,由192来区分为深色/浅色
int grayLevel = (int) (R * 0.299 + G * 0.587 + B * 0.114);
return grayLevel > 192;
}
2.处理字体颜色
private int setTitleTextColor(Boolean isNoDark){
int color=0;
if(isNoDark){
//浅色时的字体颜色
color=Color.parseColor("#000000")
}else{
//深色时字体颜色
color=Color.parseColor("#FFFFFF")
}
return color;
}
3.应用
class TestActivity extends Activity(){
//将path地址转化为Bitmap
private void changePathToBitmap(String path){
Glide.with(this).asBitmap().load(path).into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @androidx.annotation.Nullable Transition<? super Bitmap> transition) {
//正式应用 调用上面的1,2方法
tv_name.setTextColor(setTitleTextColor(getBitmapPixColor(resource)));
}
});
}
}
至此,整个效果完成。效果就是上面的两种类似的。
提供一个思路,各位砖友可以自由发挥~