Почему меняется оттенок цветов?

У меня есть несколько кнопок, и я хочу изменить их фон в зависимости от того, какая из них была нажата в последний раз. Проблема только в том, что цветовой оттенок меняется, и я не знаю почему.

Код для изменения фона

public static void swap(View on, List<View> all, int defaultColor) {
        for (View v : all) {
            Drawable backgroundOff = v.getBackground();
            backgroundOff.setTint(defaultColor);
            v.setBackground(backgroundOff);
        }
        Drawable backgroundOn = on.getBackground();
        backgroundOn.setTint(manipulateColor(defaultColor, 0.8f));
        on.setBackground(backgroundOn);
    }

Код, чтобы сделать цвет по умолчанию темнее

public static int manipulateColor(int color, float factor) {
    int a = Color.alpha(color);
    int r = Math.round(Color.red(color) * factor);
    int g = Math.round(Color.green(color) * factor);
    int b = Math.round(Color.blue(color) * factor);
    return Color.argb(a,
            Math.min(r,255),
            Math.min(g,255),
            Math.min(b,255));
}

Код кнопок

final View btnTrue = (findViewById(R.id.tofTrueInput));
final View btnFalse = (findViewById(R.id.tofFalseInput));
final int defColor = getResources().getColor(R.color.colorAccent);
final List<View> btns = new ArrayList<>();
btns.add(btnTrue);
btns.add(btnFalse);
btnTrue.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        userAnswer = true;
        ExtensionMethods.swap(btnTrue, btns, defColor);
    }
});
btnFalse.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        userAnswer = false;
        ExtensionMethods.swap(btnFalse, btns, defColor);
    }
});

Цвета

Цвет по умолчанию: Почему меняется оттенок цветов?
Измененный цвет по умолчанию: Почему меняется оттенок цветов?

И его темная версия тоже меняется.
Но почему?

Может быть проблема с округлением? Или с использованием прозрачных цветов (альфа-канал). Может, setTint складывает цвета или что-то в этом роде? Вы можете попробовать его с непрозрачными цветами и посмотреть, работает ли он тогда.

user3237736 15.04.2018 14:50

@ user3237736 Я тоже думаю, что что-то будет с setTint, потому что я уже успешно затемнил цвет этим кодом. И когда он сбрасывает цвет по умолчанию, ему не нужно манипулировать цветом.

Noel Nemeth 15.04.2018 15:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
20
1

Ответы 1

Не знаю почему, но работает. Я просто добавил эту строку в цикл foreach:

backgroundOff.setTintMode(PorterDuff.Mode.DARKEN);

public static void swap(View on, List<View> all, int defaultColor) {
        for (View v : all) {
            Drawable backgroundOff = v.getBackground();
            backgroundOff.setTintMode(PorterDuff.Mode.DARKEN);
            backgroundOff.setTint(defaultColor);
            v.setBackground(backgroundOff);
        }
        Drawable backgroundOn = on.getBackground();
        backgroundOn.setTint(manipulateColor(defaultColor, 0.8f));
        on.setBackground(backgroundOn);
    }

Другие вопросы по теме