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