18

如何让图像按钮在单击时保持“按下”状态?基本上我只是希望背景是郁闷的背景,但我不知道如何设置它。目前,我刚刚将选定的按钮背景复制到我的 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

此外,考虑到许多不同的 UI 布局,我不相信我真的可以使用这种方法。该按钮应根据用户使用的 UI 保持按下状态。

4

1 回答 1

41

有几种方法可以做到这一点:

首先,您可以简单地使用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 文件以创建可切换按钮背景,您将破坏这些设备上的一致性。

于 2010-05-01T19:36:38.890 回答