Цвета, такие как «зеленый», жестко закодированы в Color.parseColor () или они используют значения из R.color? - PullRequest
3 голосов
/ 18 июня 2019

Согласно официальной документации Color.parseColor принимает не только шестнадцатеричные значения, но и названия цветов красный , синий , зеленый , черный , белый , серый , голубой , пурпурный , желтый , светло-серый , темно-серый , серый , светло-серый , темно-серый , аква , фуксия, лайм , бордовый , флот , оливковый , фиолетовый , серебристый и чирок .

Являются ли значения этих жестко закодированными или я могу настроить, какой тип зеленый будет получен?

1 Ответ

2 голосов
/ 18 июня 2019

Давайте взглянем на источник из parseColor() в 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 определены как @ColorInt int константы в верхней части класса).Если нет, то выдается IllegalArgumentException.

Итак, чтобы ответить на ваш вопрос, да, эти значения жестко закодированы.Если вы хотите использовать свои собственные значения, определите их в файле colors.xml вашего приложения.

...