Я создаю Android-приложение, которое имеет около 15 ImageButtons. Приложение будет иметь одну активность и несколько фрагментов. Обработка событий onclick для некоторых кнопок будет выполняться фрагментами, а отдых будет выполняться по активности.Apply Tint on ImageButton
Я хочу применить оттенок на кнопках при нажатии. Я не хочу использовать разные изображения для состояния «Нормальное» и «Нажато», но хочу применять оттенок программно, поскольку для каждой кнопки необходимо сохранить два изображения.
Как я искал в Stackoverflow, может быть несколько способов. 1) Обращайтесь с onTouchEvent. В событии Action_Down применяют оттенок, а на Action_Up отменяет эффект оттенка. Оттенок можно применить с помощью setColorFilter на кнопке.
View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ImageButton view = (ImageButton) v;
view.setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP
// Your action here on button click
case MotionEvent.ACTION_CANCEL: {
ImageButton view = (ImageButton) v;
view.clearColorFilter();
view.invalidate();
break;
}
}
return true;
}
};
Проблема такого подхода заключается в том, что, так как я обработки нажатия кнопок на разных местах (активность и Fragments) Я должен сделать это изменение на каждом месте, которое трудно поддерживать. Также для обработки действия onClick я поставил оператор switch в событие Action_Up для каждой кнопки.
2) Используйте Drawables, где я создаю drawable для каждой кнопки, и в src на кнопке я указываю файл с возможностью рисования. Я написал файл с рисунком, что-то вроде этого.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/btn_pressed_drawable" /><!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/button_image" /> <!-- focused -->
<item android:drawable="@drawable/button_image" /> <!-- default -->
</selector>
и код для btn_pressed_drawable является
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/button_image"
android:tint="#770000"/>
Но проблема такого подхода заключается в том, что мне нужно создать два файла для каждой кнопки и у меня есть около 15 кнопок.
Есть ли простой способ сделать это? Я хотел бы сохранить все просто и в одном месте.
Еще одна вещь, которую я наблюдал, заключается в том, что результат, созданный двумя вышеуказанными подходами, отличается. Я вижу разный цвет, в то время как я применяю одно и то же значение оттенка в каждом случае.