如何更改交换机小部件的大小

在冰淇淋三明治一个 换人小部件被引入,显示一个开关滑块。

我添加了这样的开关:

<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 能够在给定的范围内扩展到最大尺寸,但是看起来好像绘图工具只是在提供的空间内居中。

是否有可能增加开关的大小,使其看起来更大?

102858 次浏览

我今天处理了一个类似的问题,我发现从 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);
}

不幸的是——不管是什么愚蠢的原因—— switch 小部件对此没有反应。我尝试在 OnLayoutChangeListener中做这个,也没有成功。理想情况下,当前开关的大小也应该知道在这种状态下,我想“分配”的空闲空间的填充像这样:

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

但是 sw.getWidth()onSizeChanged()中仍然返回0,可能是因为它仍然没有正确的布局。是的,我们快到了... 如果你偶然发现了什么,告诉我:)

我想我终于明白了:

  1. 开关标题大小由 <switch android:textSize=""... />控制
  2. 开关拇指文本大小由 <switch android:switchTextAppearance="".../>控制。烹饪出自己的风格。这种风格很重要,因为它控制拇指的整体宽度(稍后将详细介绍)。
  3. 整个开关高度由 <switch android:track="@drawable/shape_mythumb".../>控制。你用了9号补丁,我想这就是你有问题的原因。我用的是 <shape android:shape="rectangle"...></shape>,成功了。
  4. 拇指可绘 <switch android:thumb="".../>的高度被调整以匹配轨道的高度。拇指可拉伸的高度只对拇指的形状很重要。它不影响开关的高度。

我发现:

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

这些信息足以让您至少开始设计您想要的大小和形状的开关。有什么发现就告诉我。

以上答案是正确的。这里有一个小例子如何改变您的开关宽度使用形状绘制 我希望它能帮助一些人. 。

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) Selector for track (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"

赛道的高度并不需要直观地确定拇指/开关的整体高度。我添加了一个透明的笔触到我的轨道可绘制的形状,结果在轨道周围填充:

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

使用比例属性改变大小为我工作。

将这些行添加到 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"/>

使用 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"/>

还有一个使用 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" />