Как изменить размер виджета коммутатора

В Ice Cream Sandwich a Switch Введен виджет, в котором отображается On Off Slider.

Я добавил переключатель следующим образом:

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

Трассировка дорожки и большого пальца - это девять изображений патчей, которые должны масштабироваться до всех возможных размеров. Я надеялся, что коммутатор будет масштабироваться до максимального размера внутри заданных границ, но кажется, что чертежи просто сосредоточены внутри поставленного пространства.

Можно ли увеличить размер коммутатора, чтобы он стал больше?

Ответ 1

Думаю, я наконец понял это:

  • Размер заголовка переключателя контролируется <switch android:textSize=""... />
  • Перемещать размер большого пальца можно с помощью <switch android:switchTextAppearance="".../>. Приготовьте собственный стиль. Этот стиль важен, потому что он контролирует общую ширину большого пальца (подробнее об этом позже).
  • Общая высота коммутатора определяется <switch android:track="@drawable/shape_mythumb".../>. Вы использовали девять патчей, и я подозреваю, почему у вас проблемы. Я использовал <shape android:shape="rectangle"...></shape> и был успешным.
  • Высота выдвижного патрона <switch android:thumb="".../> регулируется в соответствии с высотой дорожки. Высота выдвижного пальца важна только для формы большого пальца. Он не влияет на высоту переключателя.

Итак, вот что я нашел:

  • Используйте <shape>...</shape> чертежи для большого пальца переключателя и дорожки переключения.
  • Ширина обоих чертежей является неослабевающей. Я установил мой на "0dp"
  • Высота дорожки определяет общую высоту коммутатора.
  • Самая длинная строка android:textOff или android:textOn будет определять ширину большого пальца. Это определяет ширину всего переключателя. Ширина переключателя всегда в два раза больше ширины большого пальца.
  • Если ширина текста большого пальца меньше высоты дорожки, форма большого пальца будет уменьшена. Это может исказить форму большого пальца. Если это произойдет, добавьте пробелы, чтобы увеличить ширину текста "off" или "on" до тех пор, пока он не будет как минимум шириной дорожки.

Это достаточно информации, чтобы, по крайней мере, начать проектирование коммутаторов по размеру и форме, которые вы им хотите. Дайте мне знать, если вы придумаете что-нибудь еще.

Ответ 2

Использование свойства 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"/>

Ответ 3

Вышеприведенный ответ прав. вот небольшой пример того, как изменить ширину вашего переключателя, используя форму, пригодную для рисования Надеюсь, это поможет кому-то...

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"

Ответ 4

Сегодня я столкнулся с подобной проблемой, и я узнал, что, начиная с 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 в onSizeChanged(), вероятно, потому, что он все еще не выложен правильно. Да, мы почти там... если вы наткнетесь на что-нибудь, дайте мне знать:)

Ответ 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>

Ответ 6

final int switchWidth = Math.max(mSwitchMinWidth,
                2 * mThumbWidth + paddingLeft + paddingRight);
        final int switchHeight = Math.max(trackHeight, thumbHeight);
        mSwitchWidth = switchWidth;

Приведенный выше код является методом "onMeasure()" в классе Switch, установите android:switchMinWidth не может правильно изменить ширину, единственный простой способ - это изменить поле "mSwitchWidth" путем динамического отражения:

try {
            Class clazz = Class.forName(Switch.class.getName());
            final Field switchWidth = clazz.getDeclaredField("mSwitchWidth");
            if (switchWidth != null) {
                switchWidth.setAccessible(true);
                int width = widthWhateverYouWant;
                switchWidth.set(this, width);
                setMeasuredDimension(width, getMeasuredHeight());
                return;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

Не забудьте setMeasuredDimension(width, getMeasuredHeight()); , потому что измеренная ширина коммутатора не основывается на поле "mSwitchWidth".

Я думаю, это не сложно изменить высоту, так как вы знаете, как изменить ширину :)

Ответ 7

очень печально, что для такого маленького изменения требуется столько усилий... Ни один из вышеперечисленных методов не работал - идеально - для меня с апреля 2019 года. Я надеюсь, что смогу сэкономить вам время...