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