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), цвет будет применяться только к области содержимого. Поэтому, если вы хотите, чтобы цвет был наложен поверх всего изображения, обязательно отметьте все изображение как область содержимого.