Android установить ImageButton как Toggle - PullRequest
17 голосов
/ 27 апреля 2010

Как можно, чтобы кнопка изображения оставалась в нажатом состоянии при нажатии на нее? По сути, я просто хочу, чтобы фон был подавленным, но я не могу понять, как его установить. На данный момент я просто скопировал выбранный фон кнопки в мою папку res, но когда я установил его в качестве фона, он становится размытым (поскольку исходное изображение больше, чем сама кнопка).

Нормальный фон: альтернативный текст http://img707.imageshack.us/img707/9199/ss20100426163452.png Что я получаю: альтернативный текст http://img707.imageshack.us/img707/912/ss20100426163357.png альтернативный текст http://img3.imageshack.us/img3/8304/ss20100426163623.png

Кроме того, я не верю, что на самом деле могу использовать этот метод, учитывая множество различных макетов пользовательского интерфейса. Кнопка должна оставаться нажатой в соответствии с пользовательским интерфейсом пользователя.

1 Ответ

40 голосов
/ 01 мая 2010

Есть несколько способов сделать это:

Во-первых, вы можете просто использовать 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>

Файлы изображений

ПРЕДУПРЕЖДЕНИЕ : если вы используете их, ваше приложение будет выглядеть несовместимым на устройствах с настроенными пользовательскими интерфейсами ОС (т. Е. С интерфейсом HTC Sense).

  • 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-файлы из репозитория с открытым исходным кодом, чтобы создать фон для переключаемых кнопок, вы нарушите согласованность на этих устройствах.

...