68

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

我添加了这样的开关:

<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 可以缩放到给定范围内的最大尺寸,但似乎可绘制对象只是在提供的空间内居中。

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

4

7 回答 7

111

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

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

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"/>
于 2016-09-22T04:52:28.813 回答
106

我想我终于想通了:

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

所以这就是我发现的:

  1. <shape>...</shape>为切换拇指和切换轨道使用可绘制对象。
  2. 两个可绘制对象的宽度无关紧要。我将我的设置为“0dp”
  3. 轨道的高度决定了开关的整体高度。
  4. 最长的字符串android:textOffandroid:textOn将决定拇指的宽度。这决定了整个开关的宽度。开关宽度始终是拇指宽度的两倍。
  5. 如果缩略图文本宽度小于轨道的高度,则缩略图形状将按比例缩小。这会扭曲拇指的形状。如果发生这种情况,请添加空格以增加“关闭”或“打开”文本的宽度,直到它至少与轨道高度一样宽。

这是足够的信息,至少可以开始将开关设计为您想要的尺寸和形状。让我知道你是否知道其他任何事情。

于 2013-11-22T22:02:30.610 回答
52

上面的答案是对的。这是一个小例子,如何使用可绘制的形状更改开关宽度,希望对某些人有所帮助..

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>

最后在 switch

利用

android:switchMinWidth="56dp"
android:thumb="@drawable/thumb"
android:track="@drawable/track"
于 2014-07-13T18:22:52.687 回答
10

我今天处理了一个类似的问题,我发现从 Jelly Bean 开始,您可以使用它setSwitchMinWidth(width);来设置完整开关的最小宽度。但是,我还认为,如果您的文本太大,则小部件会在左侧被切断。更改拇指上的默认文本填充在这里可能会派上用场, setThumbTextPadding(num);您可以对其进行修改。

唯一的问题——这实际上是一个障碍——到目前为止我偶然发现的是,当然应该根据父容器的大小来扩展开关。为此,我将开关包装在自定义线性布局中(它还为 API <= 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()仍然返回 0 in onSizeChanged(),可能是因为它仍然没有正确布局。是的,我们快到了……如果你偶然发现了什么,请告诉我:)

于 2012-09-25T16:19:15.920 回答
8

轨道的高度不必从视觉上确定拇指/开关的整体高度。我在我的轨道可绘制形状中添加了一个透明笔触,这会导致轨道周围有一个填充:

<?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>
于 2015-06-26T18:15:00.433 回答
2

还有一个选项可以使用以下方法提供最小宽度app:switchMinWidth

    <androidx.appcompat.widget.SwitchCompat
        android:id="@+id/nav_header_available_switch"
        style="@style/Widget.AppCompat.CompoundButton.Switch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:switchMinWidth="80dp"
        android:scaleY="1.3"
        tools:checked="true" />
于 2021-09-01T13:32:38.470 回答
0

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

<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"/>
于 2021-04-07T12:04:15.777 回答