是将诸如“绿色”之类的颜色硬编码在Color.parseColor()中还是使用R.color中的值?

时间:2019-06-18 09:00:23

标签: android android-color

根据official documentation Color.parseColor不仅接受十六进制值,还接受颜色名称​​ red blue green 黑色白色灰色青色品红色黄色< / em>,浅灰色 darkgray 灰色浅灰色 darkgrey ,< em> aqua 紫红色石灰栗色海军橄榄紫色蓝绿色

这些值是硬编码的还是我可以自定义产生哪种类型的 green

1 个答案:

答案 0 :(得分:2)

parseColor()android.graphics.Color的{​​{3}}:

@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值在类顶部定义为@ColorInt int常量)。如果不是,则抛出IllegalArgumentException

因此,为回答您的问题,是的,这些值是硬编码的。如果要使用自己的值,请在应用程序的colors.xml文件中定义它们。