如何改变一个Switch Widget的大小

在冰淇淋三明治开关小工具被介绍了,显示一个开关滑子。

我像这样添加了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可以在给定范围内缩放到最大尺寸,但是看起来好像drawable只是在提供的空间中居中。

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

我想我终于明白了这一点:

  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. 两个drawable的宽度都是不相关的。 我把我的设置为“0dp”
  3. 轨道的高度决定了交换机的整体高度。
  4. android:textOffandroid:textOn最长的string将决定拇指的宽度。 这决定了整个交换机的宽度。 开关宽度始终是拇指宽度的两倍。
  5. 如果拇指文本宽度小于轨道高度,则会缩小拇指形状。 这会扭曲拇指的形状。 如果发生这种情况,请添加空格以增加“closures”或“开启”文本的宽度,直到它至less与您的曲目高度一样宽。

这是足够的信息,至less开始devise切换到你想要的大小和形状。 让我知道,如果你弄清楚别的。

上面的答案是正确的。 这里是一个小例子如何改变你的开关宽度使用形状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)拇指select器(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)轨道select器(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" 

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

我今天处理了一个类似的问题,我发现从Jelly Bean开始,你可以使用setSwitchMinWidth(width); 设置完整开关的最小宽度。 我也想到,如果你的文字太大了,那么这个小部件就会在左边的部分被切断。 使用setThumbTextPadding(num);更改拇指上的默认文本填充可能会派上用场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做到这一点, OnLayoutChangeListener没有成功。 理想情况下,交换机的当前大小也应该在该状态下被知晓,并且我想将这个可用空间“分配”到这样的填充中:

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

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

轨道的高度不必视觉上决定拇指/开关的总高度。 我添加了一个透明描边到我的轨道可绘制的形状,导致在轨道周围填充:

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