【问题标题】:Setting image source for ToggleButton设置 ToggleButton 的图像源
【发布时间】:2011-08-31 07:09:41
【问题描述】:

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

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

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

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。但是当我看到它在设备上布置时它们看起来要大得多

【问题讨论】:

    标签: android


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      我想出了如何使用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>
      

      然后,为上面每个项目的可绘制对象创建一个 ScaledDrawable,它指向您的实际图像文件。例如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!
      

      【讨论】:

      • 我需要使用你的解决方案,但我不明白你在哪里使用 ScaleDrawable。您能给我们提供完整的解决方案吗?
      • 好的,我明白了,并且非常适合我。为你投票! :-)
      【解决方案3】:

      除了@caseyB 不得不说的(看看 cmets),我还必须改变活动的主题才能达到预期的效果。我认为这是 HoneyComb Xoom 的一个问题,在手机上可能看不到。 感谢大家关注我的问题并提供帮助。

      【讨论】:

        【解决方案4】:

        “快速而肮脏”的实现方式是使用相对布局并将您的 ImageView 放在 ToggleButton 的顶部。设置 android:layout_centerInParent="true" 并在切换开关上设置你的 onClick 监听器

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

        【讨论】:

        • 这并不表示切换是否被按下,因为默认情况下切换在中间有开/关标记。所以这个解决方案最终看起来就像一个普通的 ImageButton。
        【解决方案5】:

        您可以使切换按钮看起来像您想要的任何东西。您只需要创建一个样式。查看 /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 可绘制对象,你会发现:

        <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>
        

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

        【讨论】:

        • @CaseyB @Driod.net 我尝试了你所说的 - 为 ToggleButton 创建了一个新样式,但图像 src 仍然显得很大。我将编辑我的问题并列出我在那里尝试过的代码。谢谢
        • 你在哪个设备上使用它?
        • @CaseyB Xoom 在 3.1 HoneyComb 上运行。 ImageButtons 看起来符合预期。我只遇到了 ToggleButtons 的问题。
        • 那么它有可能大于 30x30px,具体取决于视图如何缩放以适应更大的屏幕。当您在 LayoutEditor 中查看它时,它的外观如何?您是否尝试过将填充和边距显式设置为 0?
        • 是的。我已将填充和边距明确设置为 0dip。 android:layout_margin="0dip" android:padding="0dip" 它在 LayoutEditor 上看起来也很大。我注意到 ImageButton 的 android:src 看起来不错,即大小合适。
        猜你喜欢
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 2017-03-14
        • 1970-01-01
        相关资源
        最近更新 更多