设置ToggleButton的图像源

VJ *_*ons 15 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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

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

Cas*_*eyB 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>
Run Code Online (Sandbox Code Playgroud)

所以如果你找到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>
Run Code Online (Sandbox Code Playgroud)

这表明它使用标准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>
Run Code Online (Sandbox Code Playgroud)

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


phr*_*ead 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>
Run Code Online (Sandbox Code Playgroud)

然后,为上面的每个项目的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%" 
     />
Run Code Online (Sandbox Code Playgroud)

最后,Android中存在一个错误,使得任何ScaledDrawable首先都不可见,直到您设置它们的级别.因此,在给视图充气时,从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!
Run Code Online (Sandbox Code Playgroud)