如何更改Switch Widget的大小

时间:2012-04-16 11:54:53

标签: android

在冰淇淋三明治中,引入了Switch小部件,显示了一个开关滑块。

我像这样添加了Switch:

<Switch 
    android:layout_width="fill_parent"
    android:layout_height="48dp"
    android:textStyle="bold"
    android:thumb="@drawable/switch_thumb_selector"
    android:track="@drawable/switch_bg_selector" />

轨道和拇指抽屉是九个补丁图像,可以扩展到所有可能的尺寸。 我希望Switch可以扩展到给定边界内的最大大小,但似乎drawables只是在提供的空间内居中。

是否可以增加Switch的大小以使其看起来更大?

6 个答案:

答案 0 :(得分:85)

我想我终于搞清楚了:

  1. 切换字幕大小由<switch android:textSize=""... />
  2. 控制
  3. 切换拇指文字大小由<switch android:switchTextAppearance="".../>控制。烹饪自己的风格。这种风格很重要,因为它控制了拇指的整体宽度(稍后将详细介绍)。
  4. 整体开关高度由<switch android:track="@drawable/shape_mythumb".../>控制。您使用了九个补丁,我怀疑这是您遇到问题的原因。我使用了<shape android:shape="rectangle"...></shape>并且成功了。
  5. 调整拇指可绘制<switch android:thumb="".../>的高度以匹配轨道的高度。拇指的可绘制高度仅对拇指的形状很重要。它不会影响开关的高度。
  6. 所以这就是我发现的:

    1. 对开关拇指和开关轨道使用<shape>...</shape> drawable。
    2. 两个drawable的宽度是无关紧要的。我将我的设置为“0dp”
    3. 曲目的高度决定了开关的整体高度。
    4. 最长的android:textOffandroid:textOn字符串将决定拇指的宽度。这决定了整个开关的宽度。开关宽度始终是拇指宽度的两倍。
    5. 如果拇指文字宽度小于轨道高度,则拇指形状将缩小。这会扭曲拇指的形状。如果发生这种情况,请添加空格以增加“关闭”或“开启”文字的宽度,直到它至少与您的曲目很高一样宽。
    6. 这足以至少开始设计开关到您想要的尺寸和形状。如果你弄清楚其他任何事情,请告诉我。

答案 1 :(得分:71)

使用scale属性更改大小对我有用。

将这些行添加到xml文件中的<switch/>标记。

android:scaleX="2"
android:scaleY="2"

您可以根据需要更改比例值。这里的值2使它的大小加倍,类似的值0.5使它的大小减半。

示例:

       <Switch
            android:id="@+id/switchOnOff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleX="2"
            android:scaleY="2"/>

答案 2 :(得分:43)

以上答案是对的。这里有一个小例子,如何使用shape drawable更改开关宽度 我希望它会帮助一些人..

1)使用拇指颜色(color_thumb.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <size android:height="40dp"  />
    <gradient android:height="40dp" android:startColor="#FF569BDA" android:endColor="#FF569BDA"/>
</shape>

2)轨道的灰色(gray_track.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <size android:height="40dp"  />
    <gradient android:height="40dp" android:startColor="#dadadada" android:endColor="#dadadada"/>
</shape>

3)拇指选择器(thumb.xml)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/gray_track" />
    <item android:state_pressed="true"  android:drawable="@drawable/color_thumb" />
    <item android:state_checked="true"  android:drawable="@drawable/color_thumb" />
    <item                               android:drawable="@drawable/gray_track" />
</selector>

4)轨道选择器(track.xml)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"  android:drawable="@drawable/color_thumb" />
     <item                               android:drawable="@drawable/gray_track" />
</selector>

最后在开关

使用

android:switchMinWidth="56dp"
android:thumb="@drawable/thumb"
android:track="@drawable/track"

答案 3 :(得分:8)

我今天处理了类似的问题,我发现从Jelly Bean开始,您可以使用setSwitchMinWidth(width);来设置完整开关的最小宽度。我还想到,如果你的文字太大,那么小部件就会在左边部分被切掉。更改拇指上的默认文本填充可能会派上用场,setThumbTextPadding(num);您可以修改它。

唯一的问题 - 实际上这是一个拦截器 - 到目前为止我偶然发现当然应该根据父容器的大小扩展交换机。为此,我将开关包装在自定义线性布局中(这也为API&lt; = 15提供了后备)并尝试了这个:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (android.os.Build.VERSION.SDK_INT >= 16) {
        adaptSwitchWidth(w);
    }
}

@TargetApi(16)
private void adaptSwitchWidth(int containerWidth) {
    Switch sw = (Switch) compoundButton;
    sw.setSwitchMinWidth(containerWidth);
}

不幸的是 - 出于任何愚蠢的原因 - 交换机小部件对此没有反应。我试图在OnLayoutChangeListener中做到这一点,但没有成功。理想情况下,开关的当前大小也应该在该状态下已知,我想将自由空间“分配”到填充,如下所示:

int textPadding = Math.max(0, (sw.getWidth() - containerWidth) / 4);
sw.setThumbTextPadding(textPadding);

sw.getWidth()仍然在onSizeChanged()中返回0,可能是因为它仍未正确布局。是的,我们差不多......如果你偶然发现了什么,请告诉我:)。

答案 4 :(得分:5)

轨道的高度无需在视觉上确定拇指/开关的整体高度。我为我的轨道可绘制形状添加了一个透明笔划,导致在轨道周围填充:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="@color/track_color"/>
    <size android:height="@dimen/track_height"  />
    <size android:width="@dimen/track_width"  />

    <!-- results in the track looking smaller than the thumb -->
    <stroke
        android:width="6dp"
        android:color="#00ffffff"/>
</shape>

答案 5 :(得分:0)

使用 SwitchCompat 代替 Switch 和 scaleX、sxaleY、填充效果更好

<androidx.appcompat.widget.SwitchCompat
                android:id="@+id/switch_transport"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="15dp"
                android:scaleX="1.5"
                android:scaleY="1.5"/>