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