Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

Анимация нажатия на кнопку без дополнительного изображения

#android


Данная тема, может не в данном контексте, но уже не однократно подымалась. Но прочитав
кучу статей так решения и не нашел (возможно плохо искал). И так, данные:
имеется кнопка с background:
 

где @drawable/button_bg - является selector следующего вида:

 




где @drawable/btn_bg_press и @drawable/btn_bg - это btn_bg.png и btn_bg_press.png
(тот же btn_bg.png только в фотошопе сделан темнее) в каталоге drawable, т.е. соответствующие
картинки на обычное состояние кнопки и при ее нажатии.
Таким образом, вопрос в следующем:
Можно ли сделать какую-нибудь анимацию на background, в данном случае это затемнение
основного background (btn_bg.png), т.е. получить что-то вроде следующего селектора:

 




т.е. использовать только одно изображение btn_bg.png (@drawable/btn_bg).
P.S.
Хотел попробовать сделать это программно, хотя вариант с xml выглядит лучше, вот
что получилось:
StateListDrawable drawList = new StateListDrawable();
Drawable bg = this.getResources().getDrawable(R.drawable.button_bg);
bg.setAlpha(100);
drawList.addState(new int[]{android.R.attr.state_enabled}, bg);
button.setBackgroundDrawable(drawList);

т.е. достал картинку button_bg.png, сделал ее немного прозрачной, после чего закинул
ее в StateListDrawable как фон по умолчанию. В итоге фон показывается, но без изменений,
т.е. без прозрачности (прозрачность взял для теста, если бы все получилось, то потом
уже поработал бы изменением яркости). А вот когда я применяю фон напрямую используя
bg, прозрачность применяется (т.е. вместо button.setBackgroundDrawable(drawList); делаю
button.setBackgroundDrawable(bg);). В общем, прошу вашей помощи в данном вопросе. Может,
кто-нибудь сталкивался с такой задачей...     


Ответы

Ответ 1



Программно можно сделать примерно так. Добавить метод типа этого: private Drawable createPressedImage(Drawable d) { BitmapDrawable bd = (BitmapDrawable) d; Bitmap bm = bd.getBitmap(); int w = bm.getWidth(); int h = bm.getHeight(); Bitmap result = Bitmap.createBitmap(w, h, bm.getConfig()); for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { int hexColor = bm.getPixel(i, j); hexColor = ...; // ваши изменения цвета result.setPixel(i, j, hexColor); } } return new BitmapDrawable(result); } И использовать его для получения Drawable в нажатом состоянии, передавая туда ваш btn_bg.png. Ну и установить его программно для вашего компонента.

Ответ 2



Разумеется, можно. Тогда вместо картинки с градиентом вам нужно ссылаться на другую xml-ку, которая уже в свою очередь будет ссылаться на картинку. Как-то так.

Комментариев нет:

Отправить комментарий