在冰淇淋三明治中,引入了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的大小以使其看起来更大?
答案 0 :(得分:85)
我想我终于搞清楚了:
<switch android:textSize=""... />
<switch android:switchTextAppearance="".../>
控制。烹饪自己的风格。这种风格很重要,因为它控制了拇指的整体宽度(稍后将详细介绍)。<switch android:track="@drawable/shape_mythumb".../>
控制。您使用了九个补丁,我怀疑这是您遇到问题的原因。我使用了<shape android:shape="rectangle"...></shape>
并且成功了。<switch android:thumb="".../>
的高度以匹配轨道的高度。拇指的可绘制高度仅对拇指的形状很重要。它不会影响开关的高度。所以这就是我发现的:
<shape>...</shape>
drawable。android:textOff
或android:textOn
字符串将决定拇指的宽度。这决定了整个开关的宽度。开关宽度始终是拇指宽度的两倍。这足以至少开始设计开关到您想要的尺寸和形状。如果你弄清楚其他任何事情,请告诉我。
答案 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"/>