В приложении, над которым я сейчас работаю, много кнопок ImageViews используются в качестве кнопок. Графика на этих кнопках использует альфа-канал, чтобы погасить края кнопки и заставить их выглядеть нерегулярными. В настоящее время мы должны создавать по 2 графика для каждой кнопки (1 для выбранного/сфокусированного/нажатого состояния, а другое для невыбранного состояния по умолчанию) и использовать для каждой кнопки StateListDrawable, определенные в файле XML.
В то время как это работает отлично, это кажется чрезвычайно расточительным, поскольку все выбранные графики - это просто тонированные версии невыделенных кнопок. Это требует времени, чтобы произвести (хотя бы немного) и заняло место в финальной APK. Кажется, что для этого должен быть простой способ.
Идеальное решение, по-видимому, состоит в том, чтобы использовать ImageViews для каждой кнопки и указать в своем атрибуте tint ColorStateList. Преимущество такого подхода состоит в том, что для всех кнопок (которые имеют один и тот же оттенок) необходим только один XML ColorStateList. Однако это не сработает. Как упоминалось здесь, ImageView генерирует исключение NumberFormatException, когда значение, заданное для оттенка, представляет собой нечто иное, чем один цвет.
Моя следующая попытка состояла в том, чтобы использовать LayerDrawable для выбранного drawable. Внутри списка слоев у нас будет исходное изображение в нижней части стека, покрытого полупрозрачным прямоугольником. Это работало над прочными частями графической кнопки. Однако края, которые должны были быть полностью прозрачными, были теперь того же цвета, что и верхний слой.
Кто-нибудь столкнулся с этой проблемой раньше и нашел разумное решение? Я хотел бы придерживаться XML-подходов, но, вероятно, будет кодировать простой подкласс ImageView, который будет делать требуемый оттенок в коде.