有几种方法可以做到这一点:
首先,您可以简单地使用ImageButton
, 并在 Java 中单击时手动切换其可绘制图像。例如,这就是Android上的股票音乐播放器为shuffle按钮所做的。尽管您无法控制处于选中状态的按钮背景,但您可以更换图像,从 Android UI 一致性的角度来看,这可能是有利的。
另一种选择是使用一组复杂的可绘制对象和九个补丁来获取 a 中的图像ToggleButton
,并可以选择在切换时更改背景和/或图像资源。这就是我将在下面展示的选项。但请记住,在执行此操作之前请注意 UI 一致性。
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>
图像文件
警告:如果您使用这些,您的应用在具有自定义 OS UI(即 HTC 的 Sense UI)的设备上看起来会不一致。
ic_mp_shuffle_<state>_btn.9.png
需要九个补丁,以便图像居中而不是拉伸以适合按钮。以下是hdpi
图标的示例版本:
res/drawable-(h|m|ldpi)/ic_mp_shuffle_(on|off)_btn.9.png
最后注意事项:请记住尽可能与系统 UI 保持一致,并注意您的应用程序可能在具有自定义版本操作系统的设备上运行,这些操作系统具有不同的 UI 元素(如按钮)图形。这方面的一个例子是HTC Sense,它有绿色按钮代替了 Android 中的灰色/橙色/黄色按钮。因此,如果您最终btn_default_...
从开源存储库复制 PNG 文件以创建可切换按钮背景,您将破坏这些设备上的一致性。