Страницы

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

среда, 15 мая 2019 г.

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

Данная тема, может не в данном контексте, но уже не однократно подымалась. Но прочитав кучу статей так решения и не нашел (возможно плохо искал). И так, данные: имеется кнопка с 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);). В общем, прошу вашей помощи в данном вопросе. Может, кто-нибудь сталкивался с такой задачей...


Ответ

Программно можно сделать примерно так. Добавить метод типа этого: 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. Ну и установить его программно для вашего компонента.

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

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