XML, состоящий из png и overlay

У меня есть кнопка png, которая включена, не нажата. Когда пользователь нажимает кнопку, я хочу только затемнить png. Мне нужно что-то вроде этого:

  <selector xmlns:android="http://schemas.android.com/apk/res/android" >
  //normal button with background my_button.png
        <item 
            android:state_enabled="true" 
            android:drawable="@drawable/my_button"   //my_button.png
            />
  //pressed button with background my_button.png overlayed by 50% black
        <item 
            android:state_pressed="true"
            android:state_enabled="true"    
            >
            <RelativeLayout 
               android:layout_width="wrap_content"
               android:layout_height="wrap_content">

              <bitmap  android:src="@drawable/my_button"/>
              <color android:color="#00000088"/>
            </RelativeLayout>
        </item>      
    </selector>

Есть ли способ, как это сделать? Или у меня должен быть еще один файл png?

Ответ 1

В my_button_bg.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/button_normal"/>
</selector>

button_normal - это png

button_pressed - это xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/button_normal"/>
    <item android:drawable="@color/btn_bg_pressed_mask"/>
</layer-list>

где btn_bg_pressed_mask - цвет:

<color name="btn_bg_pressed_mask">#19000000</color>

Ответ 2

Это должно работать

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:state_enabled="true"
        android:drawable="@drawable/my_button" />
    <item>
        <selector>
            <item
                android:state_pressed="true"
                android:state_enabled="true">
                <color android:color="#00000088" />
            </item>
        </selector>
    </item>

</layer-list>

Ответ 3

Порядок элементов в XML-селекторе имеет значение. Первый матч - это то, что будет отображаться. Как вы видите в ответе marmor, нормальное состояние кнопки указывается в конце.

Еще одна вещь, о которой нужно помнить, заключается в том, что если вы используете 9-патч-изображения (.9.png), цвет будет применяться только к области содержимого. Поэтому, если вы хотите, чтобы цвет был наложен поверх всего изображения, обязательно отметьте все изображение как область содержимого.