"green" 之类的颜色是硬编码在 Color.parseColor() 中还是使用 R.color 中的值?
Are colors like "green" hardcoded in Color.parseColor() or do they use values from R.color?
根据 official documentation Color.parseColor 不仅接受十六进制值而且接受颜色名称 red, blue , 绿色, 黑色, 白色, 灰色, 青色, 洋红色, 黄色, 浅灰色, darkgray, grey, lightgrey, darkgrey, 浅绿色、紫红色、青柠色、栗色、海军蓝、橄榄色、紫色、银色 和青色.
这些值是硬编码的还是我可以自定义生成哪种 green?
让 parseColor()
中的 take a look at source 在 android.graphics.Color
内:
@ColorInt
public static int parseColor(@Size(min=1) String colorString) {
if (colorString.charAt(0) == '#') {
// Use a long to avoid rollovers on #ffXXXXXX
long color = Long.parseLong(colorString.substring(1), 16);
if (colorString.length() == 7) {
// Set the alpha value
color |= 0x00000000ff000000;
} else if (colorString.length() != 9) {
throw new IllegalArgumentException("Unknown color");
}
return (int)color;
} else {
Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));
if (color != null) {
return color;
}
}
throw new IllegalArgumentException("Unknown color");
}
因此,首先检查字符串的第一个字符是否为 #
,表示我们使用的是 RGB 值还是 ARGB 值。但我们对此不感兴趣,所以跳到 else
语句,我们在其中查看 colorString
参数是否与 sColorNameMap
:
中的键匹配
static {
sColorNameMap = new HashMap<>();
sColorNameMap.put("black", BLACK);
sColorNameMap.put("darkgray", DKGRAY);
sColorNameMap.put("gray", GRAY);
sColorNameMap.put("lightgray", LTGRAY);
sColorNameMap.put("white", WHITE);
sColorNameMap.put("red", RED);
sColorNameMap.put("green", GREEN);
sColorNameMap.put("blue", BLUE);
sColorNameMap.put("yellow", YELLOW);
sColorNameMap.put("cyan", CYAN);
sColorNameMap.put("magenta", MAGENTA);
sColorNameMap.put("aqua", 0xFF00FFFF);
sColorNameMap.put("fuchsia", 0xFFFF00FF);
sColorNameMap.put("darkgrey", DKGRAY);
sColorNameMap.put("grey", GRAY);
sColorNameMap.put("lightgrey", LTGRAY);
sColorNameMap.put("lime", 0xFF00FF00);
sColorNameMap.put("maroon", 0xFF800000);
sColorNameMap.put("navy", 0xFF000080);
sColorNameMap.put("olive", 0xFF808000);
sColorNameMap.put("purple", 0xFF800080);
sColorNameMap.put("silver", 0xFFC0C0C0);
sColorNameMap.put("teal", 0xFF008080);
}
因此,如果我们得到匹配,则返回该颜色 ARGB 值(一些命名的 ARGB 值被定义为 class 顶部的 @ColorInt int
常量)。如果不是,则抛出 IllegalArgumentException
。
因此,为了回答您的问题,是的,这些值是硬编码的。如果您想使用自己的值,请在您应用的 colors.xml
文件中定义它们。
根据 official documentation Color.parseColor 不仅接受十六进制值而且接受颜色名称 red, blue , 绿色, 黑色, 白色, 灰色, 青色, 洋红色, 黄色, 浅灰色, darkgray, grey, lightgrey, darkgrey, 浅绿色、紫红色、青柠色、栗色、海军蓝、橄榄色、紫色、银色 和青色.
这些值是硬编码的还是我可以自定义生成哪种 green?
让 parseColor()
中的 take a look at source 在 android.graphics.Color
内:
@ColorInt
public static int parseColor(@Size(min=1) String colorString) {
if (colorString.charAt(0) == '#') {
// Use a long to avoid rollovers on #ffXXXXXX
long color = Long.parseLong(colorString.substring(1), 16);
if (colorString.length() == 7) {
// Set the alpha value
color |= 0x00000000ff000000;
} else if (colorString.length() != 9) {
throw new IllegalArgumentException("Unknown color");
}
return (int)color;
} else {
Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));
if (color != null) {
return color;
}
}
throw new IllegalArgumentException("Unknown color");
}
因此,首先检查字符串的第一个字符是否为 #
,表示我们使用的是 RGB 值还是 ARGB 值。但我们对此不感兴趣,所以跳到 else
语句,我们在其中查看 colorString
参数是否与 sColorNameMap
:
static {
sColorNameMap = new HashMap<>();
sColorNameMap.put("black", BLACK);
sColorNameMap.put("darkgray", DKGRAY);
sColorNameMap.put("gray", GRAY);
sColorNameMap.put("lightgray", LTGRAY);
sColorNameMap.put("white", WHITE);
sColorNameMap.put("red", RED);
sColorNameMap.put("green", GREEN);
sColorNameMap.put("blue", BLUE);
sColorNameMap.put("yellow", YELLOW);
sColorNameMap.put("cyan", CYAN);
sColorNameMap.put("magenta", MAGENTA);
sColorNameMap.put("aqua", 0xFF00FFFF);
sColorNameMap.put("fuchsia", 0xFFFF00FF);
sColorNameMap.put("darkgrey", DKGRAY);
sColorNameMap.put("grey", GRAY);
sColorNameMap.put("lightgrey", LTGRAY);
sColorNameMap.put("lime", 0xFF00FF00);
sColorNameMap.put("maroon", 0xFF800000);
sColorNameMap.put("navy", 0xFF000080);
sColorNameMap.put("olive", 0xFF808000);
sColorNameMap.put("purple", 0xFF800080);
sColorNameMap.put("silver", 0xFFC0C0C0);
sColorNameMap.put("teal", 0xFF008080);
}
因此,如果我们得到匹配,则返回该颜色 ARGB 值(一些命名的 ARGB 值被定义为 class 顶部的 @ColorInt int
常量)。如果不是,则抛出 IllegalArgumentException
。
因此,为了回答您的问题,是的,这些值是硬编码的。如果您想使用自己的值,请在您应用的 colors.xml
文件中定义它们。