Cómo cambiar el tamaño de un widget de cambio

En Ice Cream Sandwich se introdujo un widget de cambio que muestra un control deslizante de encendido.

Agregué el Switch de esta manera:

 

Los dibujables de pista y pulgar son nueve imágenes de parche que deben escalarse a todos los tamaños posibles. Esperé que el Switch escalara al tamaño máximo dentro de los límites dados, pero parece como si los drawables estuvieran centrados dentro del espacio provisto.

¿Es posible boost el tamaño del Switch para que parezca más grande?

Creo que finalmente me di cuenta de esto:

  1. El tamaño de los subtítulos del conmutador está controlado por
  2. Cambiar el tamaño del texto del pulgar está controlado por . Cocina un estilo propio. Este estilo es importante porque controla el ancho total del pulgar (más sobre esto más adelante).
  3. La altura general del interruptor está controlada por track ="@drawable/shape_mythumb".../> . Utilizaste un parche de nueve, que sospecho que es por eso que tienes un problema. Utilicé un y tuve éxito.
  4. La altura del pulgar drawable se ajusta para que coincida con la altura de la pista. La altura del dibujo del pulgar solo es importante para la forma del pulgar. No afecta la altura del interruptor.

Así que esto es lo que encontré:

  1. Usa los elementos ... tanto para el pulgar del interruptor como para cambiar de pista.
  2. El ancho de ambos drenables es irrelajante. Configuré el mío a “0dp”
  3. La altura de la pista determina la altura total del interruptor.
  4. La cadena más larga de android:textOff o android:textOn determinará el ancho del pulgar. Esto determina el ancho de todo el interruptor. El ancho del interruptor siempre es el doble del ancho del pulgar.
  5. Si el ancho del texto del pulgar es menor que la altura de la pista, la forma del pulgar se reducirá. Esto puede distorsionar la forma del pulgar. Si esto sucede, agregue espacios para boost el ancho de su texto “apagado” o “encendido” hasta que sea al menos tan ancho como su pista sea alta.

Esta es información suficiente para, al menos, comenzar a diseñar interruptores con el tamaño y la forma que desee. Avísame si descubres algo más.

Usar la propiedad de escala para cambiar el tamaño funcionó para mí.

Agregue estas líneas a su etiqueta en el archivo xml.

 android:scaleX="2" android:scaleY="2" 

Puede cambiar el valor de escala según su necesidad. Aquí el valor 2 lo hace doble en tamaño, igualmente el valor 0.5 lo hace la mitad de tamaño.

Ejemplo:

   

La respuesta anterior es correcta. Aquí hay un pequeño ejemplo de cómo cambiar el ancho de su interruptor usando la forma dibujable. Espero que ayude a alguien.

1) Usa tu color para el pulgar (color_thumb.xml)

     

2) color gris para la pista (gray_track.xml)

     

3) Selector para el pulgar (thumb.xml)

       

4) Selector para la pista (track.xml)

     

y finalmente en el interruptor

utilizar

 android:switchMinWidth="56dp" android:thumb="@drawable/thumb" android:track="@drawable/track" 

Hoy setSwitchMinWidth(width); un problema similar y descubrí que a partir de Jelly Bean puedes usar setSwitchMinWidth(width); para establecer el ancho mínimo del interruptor completo. También pensé que si tus textos son demasiado grandes, el widget se corta en la parte izquierda. Cambiar el relleno de texto predeterminado en el pulgar puede ser útil aquí, con setThumbTextPadding(num); puedes modificar eso.

El único problema, y ​​esto es un bloqueador, he tropezado hasta el momento es que, por supuesto, uno debe ampliar el interruptor de acuerdo con el tamaño del contenedor principal. Para eso envolví el interruptor en un diseño lineal personalizado (que también proporciona un respaldo para API <= 15) y probé esto:

 @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); } 

Desafortunadamente, por alguna estúpida razón, el widget de cambio no reactjs a eso. Intenté hacer eso en OnLayoutChangeListener sin tener éxito tampoco. Idealmente, el tamaño actual del conmutador también debería conocerse en ese estado y quería “distribuir” el espacio libre al relleno de esta manera:

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

pero sw.getWidth() todavía devuelve 0 en onSizeChanged() , probablemente porque aún no está distribuido correctamente. Sí, casi llegamos … si tropiezas con algo, házmelo saber 🙂

La altura de la pista no tiene que determinar visualmente la altura general del pulgar / interruptor. Agregué un trazo transparente a la forma dibujable de la pista, lo que da como resultado un relleno alrededor de la pista: