【Android】动态获取当前背景图,根据背景图色动态改变字体颜色

本文介绍了一种方法,通过分析用户上传的头像图片颜色深浅,动态调整显示在其上的文字颜色,确保在深色和浅色背景下都有良好的可读性。通过获取图片的RGB值并计算灰度,判断背景色深浅,进而设置相应的字体颜色。具体实现包括获取图片颜色、处理字体颜色以及在实际应用中如何调用这些方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情况描述:市面上很多的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)));
                }
            });
        }
    }

至此,整个效果完成。效果就是上面的两种类似的。
提供一个思路,各位砖友可以自由发挥~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值