2013-08-29 10 views
7

Mi rendo conto che questa è probabilmente una domanda di layout banale, ma non riesco a farlo funzionare come voglio senza sovrapporre quello che ritengo sia troppi layout di contenitore. Quello che sto cercando di fare è impostare un ImageView in modo tale che siano soddisfatte le seguenti condizioni:Android ImageView dimensionato per peso non centrato su LinearLayout principale

  1. La larghezza di ImageView è una determinata percentuale della larghezza del suo genitore (la larghezza dello schermo per ora).
  2. ImageView è centrato orizzontalmente all'interno dello schermo.

Ho creato un test case utilizzando un layout XML, ma in pratica creerò questi layout e viste a livello di programmazione; Non penso che questo sia importante allo scopo di capire il layout corretto.

Ho una certa familiarità con i pesi nei layout Android e il modo in cui vengono in genere utilizzati per impaginare più viste con fattori di ponderazione relativi. Per soddisfare la condizione 1, creo un container LinearLayout (orientamento orizzontale), imposta il suo peso Somma = 1, quindi incorporo il mio ImageView con un peso di qualsiasi percentuale che voglio, per esempio 0.5. Funziona!

Successivamente, desidero che ImageView finisca per essere centrato nello schermo in senso orizzontale. Così ho impostato la gravità su "center"/"centerHorizontal". Questo è il punto in cui sono bloccato, perché non importa quali siano le impostazioni di gravità/layout_gravità che scelgo, sembra sempre allineare sul lato sinistro.

file di layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF"> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:weightSum="1.0"> 
     <ImageView 
      android:src="@drawable/earth" 
      android:adjustViewBounds="true" 
      android:layout_width="0" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      android:layout_gravity="center_horizontal" 
      android:id="@+id/imageView1" /> 
    </LinearLayout> 
</LinearLayout> 

Risultato:

Resulting image aligned to the left

Quello che voglio ottenere è qualcosa di simile:

Desired result

Ma al fine di raggiungere che io ha dovuto inserire due LinearLayouts fittizi con pesi 0,25 su entrambi i lati del mio ImageView in questo modo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF"> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:weightSum="1.0"> 
     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="0" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.25"/> 
     <ImageView 
      android:src="@drawable/earth" 
      android:adjustViewBounds="true" 
      android:layout_width="0" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      android:layout_gravity="center_horizontal" 
      android:id="@+id/imageView1" /> 
     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="0" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.25"/> 
    </LinearLayout> 
</LinearLayout> 

Questo è un layout di brutto e goffo, a mio parere, non solo perché ora sto dover utilizzare 3 LinearLayouts supplementari a parte il mio LinearLayout di primo livello solo per ridimensionare e posizionare la mia vista, ma anche perché voglio fare tutto il layout in modo programmatico e dinamico. Potrei decidere di allineare a destra o sinistra le mie viste al runtime, o modificare il loro fattore di scala in relazione alla larghezza dello schermo, che in questa soluzione richiede potenzialmente l'aggiunta/rimozione di viste di layout fittizie e l'impostazione di tutti i pesi in modo appropriato.

Spero che qualcuno migliori i layout di quello che avrò una soluzione migliore! Idealmente qualcosa in cui posso semplicemente impostare la "gravità" (anche se non sono riuscito a farlo funzionare), o un modo alternativo per impostare la larghezza senza il contenitore orizzontale LinearLayout e pesi, poiché senza quel contenitore posso centrare orizzontalmente nel mio LinearLayout verticale di livello superiore.

Grazie!

MODIFICA: Mi sono appena reso conto che nel mio secondo tentativo di layout utilizzando LinearLayouts fittizio padding che posso fare a meno con il secondo padding LinearLayout (impostato sul peso di 0.25) e utilizzare solo un padding fittizio LinearLayout prima del mio ImageView, poiché sono relativi a un peso predeterminato nel genitore. Es .:

<LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:weightSum="1.0"> 
     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="0" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.25"/> 
     <ImageView 
      android:src="@drawable/earth" 
      android:adjustViewBounds="true" 
      android:layout_width="0" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      android:layout_gravity="center_horizontal" 
      android:id="@+id/imageView1" /> 
    </LinearLayout> 

Ancora non è la soluzione ideale che speravo.

risposta

7

si può semplicemente aggiungere android:gravity="center" al layout lineare (non in ImageView)

spero che aiuta.

+0

forse 'center_horizontal'? – gunar

+0

@gunar, nope, center_horizontal non funziona. Come mi aspettavo dal momento che il genitore di ImageView è un LL orizzontale, il centraggio è solo nella direzione verticale. – Camputer

+0

non necessario perché l'altezza di linearlayout è già impostata su Android: layout_height = "wrap_content" – Simo

0

La gravità di ImageView non si concentra perché LinearLayout principale è orizzontale.

Si desidera impostare la gravità del LinearLayout padre, che si centra orizzontalmente all'interno del suo padre (LinearLayout verticale).

Problemi correlati