2012-04-16 12 views
42

In Ice Cream Sandwich è stato introdotto un widget Switch che visualizza un dispositivo di scorrimento On Off.Come modificare le dimensioni di un widget dello Switch

ho aggiunto lo switch simili:

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

pista e pollice drawable sono nove immagini di patch che dovrebbe scalare a tutte le dimensioni possibili. Spero che lo Switch si riduca alla dimensione massima all'interno dei limiti specificati, ma sembra che i drawable siano appena centrati nello spazio fornito.

E 'possibile aumentare le dimensioni dello Switch per farlo apparire più grande?

+1

valid..m di fronte lo stesso problema :( –

risposta

7

Oggi mi sono occupato di un problema simile e ho scoperto che a partire da Jelly Bean è possibile utilizzare setSwitchMinWidth(width); per impostare la larghezza minima dell'interruttore completo. Ho anche pensato, tuttavia, che se i tuoi testi sono troppo grandi, il widget è appena troncato nella parte sinistra. La modifica del padding di testo predefinito sul pollice potrebbe tornare utile qui, con setThumbTextPadding(num); è possibile modificarlo.

L'unico problema - e questo è un blocco in realtà - ho inciampato finora è che si dovrebbe naturalmente espandere l'interruttore in base alle dimensioni del contenitore genitore. Per questo ho avvolto l'interruttore in una configurazione lineare (il quale fornisce anche fallback per API < = 15) e provato questo:

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

Purtroppo - per qualsiasi motivo stupido - il widget interruttore non reagisce a tale . Ho provato a farlo in un OnLayoutChangeListener senza avere successo neanche. Idealmente, la dimensione attuale del interruttore deve anche essere conosciuto in quello stato e ho voluto a "distribuire" lo spazio libero per l'imbottitura in questo modo:

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

ma sw.getWidth() ritorna ancora 0 a onSizeChanged(), probabilmente perché è ancora non disposti correttamente. Sì, ci siamo quasi ... se si imbattono in qualcosa, fatemelo sapere :)

+2

"thumbTextPadding" è utile Può essere utilizzato in XML come 'Android:. ThumbTextPadding = "3DP"' – situee

+0

attributo android: thumbTextPadding è utile per i dispositivi Samsung durante la personalizzazione di Switch. – AB1209

73

Credo che ho finalmente capito questo:

  1. interruttore formato didascalia è controllato da <switch android:textSize=""... />
  2. Interruttore la dimensione del testo del pollice è controllata da <switch android:switchTextAppearance="".../>. Prepara uno stile tutto tuo. Questo stile è importante perché controlla la larghezza complessiva del pollice (ne parleremo più avanti).
  3. L'altezza generale dell'interruttore è controllata da <switch android:track="@drawable/shape_mythumb".../>. Hai usato una patch di nove, che sospetto sia il motivo per cui hai un problema. Ho usato uno <shape android:shape="rectangle"...></shape> e ho avuto successo.
  4. L'altezza del pollice estraibile <switch android:thumb="".../> viene regolata in base all'altezza della traccia. L'altezza del drawable del pollice è importante solo per la forma del pollice. Non influenza l'altezza dell'interruttore.

Quindi, ecco cosa ho trovato:

  1. Utilizzare <shape>...</shape> drawable sia per il pollice interruttore e la pista interruttore.
  2. La larghezza di entrambi i drawable è irrilevante.Ho impostato il mio su "0dp"
  3. L'altezza della traccia determina l'altezza complessiva dell'interruttore.
  4. La stringa più lunga di android:textOff o android:textOn determinerà la larghezza del pollice. Questo determina la larghezza dell'intero switch. La larghezza dell'interruttore è sempre il doppio della larghezza del pollice.
  5. Se la larghezza del testo del pollice è inferiore all'altezza della traccia, la forma del pollice verrà ridimensionata. Questo può distorcere la forma del pollice. Se ciò accade, aggiungi degli spazi per aumentare la larghezza del testo "disattivato" o "attivo" finché non è largo almeno quanto la traccia è alta.

Questa è un'informazione sufficiente per iniziare a progettare gli switch in base alle dimensioni e alla forma desiderati. Fammi sapere se trovi qualcos'altro.

+2

merita un upvote .. la traccia è quella che determina la dimensione dello switch.E il trucco forma funziona.Io dovevo passare attraverso il modo duro di creare nove patch con diverse altezze per diversi dispositivi.e finalmente ottenuto questa soluzione.Grazie. –

+0

@quantium Hai un esempio speciale a questo?Perché ho lo stesso problema ma la tua soluzione non funziona per me. Penso di fare qualcosa di sbagliato. –

+0

Fantastico! Pensavo che l'altezza di un interruttore non potesse mai essere cambiata. Grazie. – Nirmal

35

La risposta sopra è corretta. ecco un piccolo esempio di come modificare la larghezza switch utilizzando la forma drawable Spero che vi aiuterà qualcuno ..

1) Utilizzare ur colore per pollice (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) grigio colore per binari (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) Selettore per pollice (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) Selettore per binari (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> 

e infine interruttore

uso

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

Voglio sapere dove creiamo il file track.xml o thumb.xml – Kishan

+8

Quando uso questo codice il mio interruttore scompare .. qualche aiuto? – Brandon

+0

@Kishan, puoi inserire questi file xml all'interno di res/drawable/ –

5

altezza della traccia non deve determinare visivamente pollice/interruttore generale altezza. Ho aggiunto un colpo trasparente per la mia pista forma drawable che si traduce in un'imbottitura intorno alla pista:

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

Puoi aggiungere padding alla tua tracciabile per renderlo completamente simile a un pulsante di commutazione/interruttore ios. –

40

utilizzando la proprietà scala per cambiare la dimensione funzionato per me.

Aggiungi queste righe al tag <switch/> nel file xml.

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

È possibile modificare il valore di scala secondo le proprie necessità. Qui il valore 2 lo rende di dimensioni doppie, analogamente il valore 0,5 lo rende di dimensioni ridotte.

Esempio:

 <Switch 
      android:id="@+id/switchOnOff" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleX="2" 
      android:scaleY="2"/> 
+1

Sembra il modo più semplice! Grazie – Tima

+2

Questa è la risposta migliore e più efficiente – Krishna

+1

Grazie amico. Funziona bene. – sivaprakash

Problemi correlati