Ответ 1
Есть несколько способов сделать это:
Во-первых, вы можете просто использовать ImageButton
и вручную переключать его изображение, нарисованное по клику в Java. Это то, что стандартный музыкальный проигрыватель на Android делает, например, для кнопки shuffle. Хотя вы не сможете контролировать фон кнопки в проверенном состоянии, вы сможете поменять изображение, что может быть выгодно с точки зрения согласованности пользовательского интерфейса Android.
Другим вариантом является использование сложного набора рисованных объектов и девяти заплаток для получения изображения внутри ToggleButton
с возможностью изменения фона и/или ресурса изображения при переключении. Этот вариант я покажу ниже. Но помните, что будьте осторожны с последовательностью пользовательского интерфейса, прежде чем делать это.
res/layout/foo.xml
...
<ToggleButton
android:textOn="" android:textOff=""
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shuffle_button" />
...
res/drawable/shuffle_button.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- use "@android:drawable/btn_default" to keep consistent with system -->
<item android:drawable="@drawable/toggle_button_background" />
<item android:drawable="@drawable/shuffle_button_image" />
</layer-list>
res/drawable/toggle_button_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- checked state -->
<item android:state_pressed="false" android:state_checked="true"
android:drawable="@drawable/btn_default_checked" />
<item android:state_window_focused="false" android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_window_focused="false" android:state_enabled="false"
android:drawable="@drawable/btn_default_normal_disable" />
<item android:state_pressed="true"
android:drawable="@drawable/btn_default_pressed" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/btn_default_selected" />
<item android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_focused="true"
android:drawable="@drawable/btn_default_normal_disable_focused" />
<item android:drawable="@drawable/btn_default_normal_disable" />
</selector>
res/drawable/shuffle_button_image.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_mp_shuffle_on_btn" android:state_checked="true" />
<item android:drawable="@drawable/ic_mp_shuffle_off_btn" />
</selector>
Файлы изображений
-
btn_default_<state>.9.png
можно найти вframeworks/base.git
разделеcore/res/res/drawable-hdpi
иcore/res/res/drawable-mdpi
(также ldpi).
ВНИМАНИЕ: если вы используете их, ваше приложение будет выглядеть несовместимым на устройствах с настроенными пользовательскими интерфейсами ОС (например, HTC Sense UI).
-
ic_mp_shuffle_<state>_btn.9.png
должны иметь девять пятен, чтобы изображение центрировалось, а не растягивалось, чтобы соответствовать кнопке. Ниже приведены примерыhdpi
версий иконки:
res/drawable-(h|m|ldpi)/ic_mp_shuffle_(on|off)_btn.9.png
Заключительное примечание. Не забывайте соблюдать согласованность с пользовательским интерфейсом системы, когда это возможно, и помните о том, что ваше приложение может работать на устройствах с настроенными версиями ОС, которые имеют различную графику для таких элементов пользовательского интерфейса, как кнопки. Примером этого является HTC Sense, который имеет зеленые кнопки вместо серых/оранжевых/желтых в стандартном Android. Итак, если вы в конечном итоге btn_default_...
PNG файлы btn_default_...
из репозитория с открытым исходным кодом, чтобы создать фон для переключаемых кнопок, вы нарушите согласованность на этих устройствах.