我有一个菜单,从而用户可以选择颜色,我显示它们是这样的:有没有简单的方法来改变基于背景颜色的文本颜色?
因为我写在黑色的颜色代码,暗蓝色背景使得难以读取和黑色是显然完全隐藏。首先,这不是特别重要,颜色是用户感兴趣的颜色。
我可以把颜色代码放在白色背景上的一个单独的框中,但出于兴趣我想知道是否有一些标准代码处理这个或一些简单的方法,可以用来确保文本始终可读?如果有人可以指点我的资源与任何帮助,将不胜感激。
我有一个菜单,从而用户可以选择颜色,我显示它们是这样的:有没有简单的方法来改变基于背景颜色的文本颜色?
因为我写在黑色的颜色代码,暗蓝色背景使得难以读取和黑色是显然完全隐藏。首先,这不是特别重要,颜色是用户感兴趣的颜色。
我可以把颜色代码放在白色背景上的一个单独的框中,但出于兴趣我想知道是否有一些标准代码处理这个或一些简单的方法,可以用来确保文本始终可读?如果有人可以指点我的资源与任何帮助,将不胜感激。
我只是选择白色,如果颜色是黑色的,黑色的,如果是亮的。许多应用程序都这样做,但我认为.net库中没有标准实现。
试着这么做:
Color ForegroundForBackground(Color bg) {
if(bg.R*2 + bg.G*7 + bg.B < 500)
return Color.White;
else
return Color.Black;
}
你想在纯蓝色用白色,而不是纯粹的格伦和纯红色的,因为那些看起来更明亮。将数字调整为看起来合理的数字。
编辑:由于j.k.请提供Luminance (colorimetry)的链接,我已经改变了线性组合,以便更好地匹配(将数字四舍五入为1位数,不需要更多)。尽管我怀疑绿色系数在测试中可能会过大。
+1这实际上是我怎么做,虽然我可能会查找比例因子,如http://en.wikipedia.org/wiki/Luminance_%28colorimetry%29而不是我自己的 –
是的,应该可以动态调整颜色。
有两个部分给你的问题。第一个是改变颜色,第二个是确定要改变颜色。
首先是两者中较为复杂的。我看到两个主要选择:
创建从现有的控制继承自己的控制,并覆盖相应的函数来检查的背景,以回报对比前景色。
创建一个value converter和bind您的前景色从转换器返回。
这两个选项中,值转换器为您提供跨控件的最大可移植性。但它可能会或可能不适用于您正在使用的UI技术。
第二步,确定使用什么颜色,有点直截了当。 This和this是处理反转或反转颜色的两个SO问题。有一些基于饱和度的边缘情况可能无法达到您期望的效果。另外,如果你的背景颜色是有限的,你可以简单地使用查找表,并确保结果是你所期望的。
我会说第二个比较复杂,人类的看法是一件棘手的事情 –
你可以只颠倒背景颜色的所有位。适用于很多颜色。但是你可以在品红(#ff00ff)上得到亮绿色(#00ff00)等东西,这会增加设计团队的自杀率。 –
@thorstenmüller尝试用#808080 –
感谢您的链接。看起来这不是特别简单。 – Family