0

Я создаю 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 кнопок.

Есть ли простой способ сделать это? Я хотел бы сохранить все просто и в одном месте.

Еще одна вещь, которую я наблюдал, заключается в том, что результат, созданный двумя вышеуказанными подходами, отличается. Я вижу разный цвет, в то время как я применяю одно и то же значение оттенка в каждом случае.

ответ

0

Вам необходимо написать код цветного фильтра setColorFilter(..) с getBackground(). После этого ваш код выглядеть следующим образом:

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.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);//line changed 
      v.invalidate(); 
      break; 
     } 
     case MotionEvent.ACTION_UP 
      // Your action here on button click 

     case MotionEvent.ACTION_CANCEL: { 
       ImageButton view = (ImageButton) v; 
       view.getBackground().clearColorFilter();//line changed 
       view.invalidate(); 
       break; 
      } 
     } 
     return true; 
    } 
}; 

Я надеюсь, что его помощь.