设置ToggleButton的图像源

时间:2011-05-23 16:21:16

标签: android

我有一个30px x 30px png文件,我想用作android:src而不是android:background。通过使用它作为背景,并提到高度和宽度的“wrap_content”,最终结果看起来更像是45px x 45像素。

理想情况下,我需要的是ImageButton和ToggleButton的混合。我希望有一个设置ImageButton的android:src的功能,以及为我自动保存状态的切换功能。

任何解决方案或解决方法?

TIA。

嗨,它似乎没有帮助创造另一种风格。 src仍然显得更大,原始的30px x 30px。

在main.xml中:

<ToggleButton android:id="@+id/blah"
    style="@style/myToggle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
</ToggleButton>

在Styles.xml中

<style name="myToggle">
    <item name="android:textOn">""</item>
    <item name="android:textOff">""</item>
    <item name="android:disabledAlpha">?android:attr/disabledAlpha</item>
    <item name="android:background">@drawable/my_btn_toggle_bg</item>
</style>

在my_btn_toggle_bg.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/myBackground" android:drawable="@android:drawable/btn_default_small" />
    <item android:id="@+id/myToggle" android:drawable="@drawable/my_btn_toggle" />
</layer-list>

在my_btn_toggle.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false" android:drawable="@drawable/pausebutton" />
    <item android:state_checked="true" android:drawable="@drawable/playbutton" />
</selector>

playbutton.png和pausebutton.png各占30px x 30px。但是当我看到它放在设备上时,它们看起来要大得多

5 个答案:

答案 0 :(得分:16)

您可以使切换按钮看起来像您想要的任何内容。你只需要创建一个样式。看一下/platforms//data/res/values/styles.xml并搜索Widget.Button.ToggleButton看起来像这样:

<style name="Widget.Button.Toggle">
    <item name="android:background">@android:drawable/btn_toggle_bg</item>
    <item name="android:textOn">@android:string/capital_on</item>
    <item name="android:textOff">@android:string/capital_off</item>
    <item name="android:disabledAlpha">?android:attr/disabledAlpha</item>
</style>

所以,如果你找到btn_toggle_bg drawable,你会发现:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+android:id/background" android:drawable="@android:drawable/btn_default_small" />
    <item android:id="@+android:id/toggle" android:drawable="@android:drawable/btn_toggle" />
</layer-list>

它向您展示了它使用标准的Button背景和一个名为btn_toggle的可绘制的src。 btn_src.xml如下所示:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false" android:drawable="@drawable/btn_toggle_off" />
    <item android:state_checked="true" android:drawable="@drawable/btn_toggle_on" />
</selector>

用于显示按钮状态的两个drawable。它们实际上被称为btn_toggle_ {on / off} .9.png,因为它们是9个Patch图像,因此它们会拉伸以匹配按钮大小。

答案 1 :(得分:6)

我想出了如何做到这一点(使用ScaleDrawable将较小的背景图像置于一个较大的ToggleButton中):

将ToggleButton设置为使用选择器Drawable,正常情况下:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:variablePadding="true">
    <item android:drawable="@drawable/ic_star_selected_centered"
          android:state_checked="true" />
    <item android:drawable="@drawable/ic_star_default_white_centered"
          android:state_pressed="true" />
    <item android:drawable="@drawable/ic_star_default_black_centered" />
</selector>

然后,为上面的每个项目的drawables制作一个ScaledDrawable,它指向您的ACTUAL图像文件。例如ic_star_selected_centered.xml:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_star_selected"
    android:scaleGravity="center"
    android:scaleHeight="100%"
    android:scaleWidth="100%" 
     />

最后,有一个bug in Android that makes any ScaledDrawables invisible at first,直到你设定他们的等级。因此,在为视图充气时,请从1-10000调用setLevel()(1是最小刻度,10000是全尺寸):

    StateListDrawable star = (StateListDrawable) myToggleButton.getBackground();
    star.setLevel(5000); // centers the image at half size. shame on Android for using magic numbers!

答案 2 :(得分:1)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <inset android:insetLeft="15dp" android:insetRight="15dp" android:insetTop="15dp" android:insetBottom="15dp">
            <bitmap android:src="@drawable/ic_star_selected_centered" />
        </inset>
    </item>

    <item android:state_pressed="true" >
        <inset android:insetLeft="15dp" android:insetRight="15dp" android:insetTop="15dp" android:insetBottom="15dp">
            <bitmap android:src=" android:src="@drawable/ic_star_default_white_centered" />
        </inset>
    </item>

    <item >
        <inset android:insetLeft="15dp" android:insetRight="15dp" android:insetTop="15dp" android:insetBottom="15dp">
            <bitmap android:src="@drawable/ic_star_default_black_centered" />
        </inset>
    </item>
</selector>

答案 3 :(得分:0)

除了@caseyB不得不说(看评论),我不得不改变活动的主题以达到预期的效果。我认为这是HoneyComb Xoom上的问题,可能在手机上看不到。 感谢大家查看我的问题和帮助。

答案 4 :(得分:-1)

“快速而肮脏”的实现方法是使用相对布局并将ImageView放在ToggleButton的顶部。设置android:layout_centerInParent="true"并在切换

上设置onClick侦听器

说 - CaseyB的另一个解决方案(自定义背景文件)是正确的方法