У меня есть несколько кнопок, и я хочу изменить их фон в зависимости от того, какая из них была нажата в последний раз. Проблема только в том, что цветовой оттенок меняется, и я не знаю почему.
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);
}
});
Цвет по умолчанию: 
Измененный цвет по умолчанию: 
И его темная версия тоже меняется.
Но почему?
@ user3237736 Я тоже думаю, что что-то будет с setTint, потому что я уже успешно затемнил цвет этим кодом. И когда он сбрасывает цвет по умолчанию, ему не нужно манипулировать цветом.




Не знаю почему, но работает. Я просто добавил эту строку в цикл 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);
}
Может быть проблема с округлением? Или с использованием прозрачных цветов (альфа-канал). Может,
setTintскладывает цвета или что-то в этом роде? Вы можете попробовать его с непрозрачными цветами и посмотреть, работает ли он тогда.