37

Ho un layout che contiene alcuni campi di testo e ha un'immagine di sfondo che viene visualizzata nella parte superiore della mia attività. Mi piacerebbe che l'immagine di sfondo si ridimensionasse per avvolgere il contenuto (non preoccuparti delle proporzioni). Tuttavia, l'immagine è più grande del contenuto, quindi il layout avvolge l'immagine di sfondo. Ecco il mio codice originale:Ridimensiona l'immagine di sfondo per avvolgere il contenuto del layout

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:id="@+id/HeaderList" 
    android:layout_gravity="top" 
    android:layout_height="wrap_content" 
    android:background="@drawable/header"> 
    <TextView 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:id="@+id/NameText" 
     android:text="Jhn Doe" 
     android:textColor="#FFFFFF" 
     android:textSize="30sp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:paddingLeft="4dp" 
     android:paddingTop="4dp" 
    /> 
    <TextView 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:textColor="#FFFFFF" 
     android:layout_alignParentLeft="true" 
     android:id="@+id/HoursText" 
     android:text="170 hours" 
     android:textSize="23sp" 
     android:layout_below="@+id/NameText" 
     android:paddingLeft="4dp" 
    /> 
</RelativeLayout> 

Dopo la ricerca attraverso alcune altre domande, ho trovato questi due:

How to wrap content views rather than background drawable?

Scale a Drawable or background image?

Sulla base di questo, ho creato un FrameLayout w/un ImageView mostrando lo sfondo. Sfortunatamente, non riesco ancora a farlo funzionare. Voglio che l'altezza dell'immagine di sfondo si riduca/si espanda con la dimensione delle viste del testo, ma con FrameLayout, ImageView si adatta alle dimensioni del suo genitore e non riesco a trovare un modo per far si che il genitore si adatti la dimensione del layout di visualizzazione del testo. Ecco il mio codice aggiornato:

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <ImageView android:src="@drawable/header" 
     android:layout_width="fill_parent" 
     android:scaleType="fitXY" 
     android:layout_height="fill_parent" 
     /> 
    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:id="@+id/HeaderList" 
     android:layout_gravity="top" 
     android:layout_height="wrap_content" 
     > 
     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:id="@+id/NameText" 
      android:text="John Doe" 
      android:textColor="#FFFFFF" 
      android:textSize="30sp" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:paddingLeft="4dp" 
      android:paddingTop="4dp" 
      /> 
     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:textColor="#FFFFFF" 
      android:layout_alignParentLeft="true" 
      android:id="@+id/HoursText" 
      android:text="170 hours" 
      android:textSize="23sp" 
      android:layout_below="@+id/NameText" 
      android:paddingLeft="4dp" 
      /> 
    </RelativeLayout> 
</FrameLayout> 

Qualcuno ha qualche suggerimento per il modo migliore per fare una scala dell'immagine alle dimensioni dei contenuti di alcuni layout? Non mi interessa il rapporto di aspetto dell'immagine, in quanto non ha importanza, voglio solo che riempia lo sfondo.

Grazie!

+1

Due anni dopo e ancora nessuna risposta accettabile. Hai trovato una soluzione? – jfcartier

+0

Lo stesso problema qui, credo che non ci sia una soluzione. Dobbiamo occuparci di The Wrong Thing (TM). –

risposta

0

Penso di aver fatto qualcosa di simile a questo in passato, provare a giocare con l'impostazione della gravità nella visualizzazione dell'immagine, penso che uno di loro dovrebbe fare ciò che si sta cercando.

+0

Grazie per il suggerimento. Ho provato a giocare con il parametro layout_gravity sia su ImageView che su RelativeLayout, ma non ho avuto molta fortuna. Ho provato sia le opzioni "clip" e "riempimento", insieme a varie combinazioni di esse e gli altri valori di posizionamento, e nessuno di loro sembra aver avuto alcun effetto. Ti ricordi quali sono i valori di gravità specifici che hai usato? – bjg222

0

Non l'ho provato, ma se si imposta l'immagine di sfondo dinamicamente su onCreate che potrebbe funzionare. La dimensione del layout dovrebbe essere già impostata.

+0

Ho provato questo e per la mia situazione, non ha funzionato. Il gruppo di viste è stato ridimensionato per contenere l'immagine di sfondo. – greg7gkb

1

Creare un xml disegnabile, dicono mybackground.xml

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/header" 
    android:gravity="fill" /> 

Poi, nel tuo RelativeLayout nel primo frammento di codice utilizzare

android:background="@drawable/mybackground" 
+0

Appena provato, questo non funziona. – jontro

+1

+1 non funziona, android: gravità = "fill" solo upscales – jfcartier

-1

È possibile utilizzare questo:

<ImageView 
... 
android:scaleType="fitXY" 
> 

Speranza ha aiutato)))

-1

Prova questo codice .....

<LinearLayout 
    android:layout_width="fill_parent" 
    android:id="@+id/HeaderList" 
    android:orientation="vertical" 
    android:layout_gravity="top" 
    android:layout_height="wrap_content" 
    android:background="@drawable/header"> 
<TextView 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:id="@+id/NameText" 
    android:text="Jhn Doe" 
    android:textColor="#FFFFFF" 
    android:textSize="30sp" 
    android:paddingLeft="4dp" 
    android:paddingTop="4dp" 
/> 
<TextView 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:textColor="#FFFFFF" 
    android:id="@+id/HoursText" 
    android:text="170 hours" 
    android:textSize="23sp" 
    android:paddingLeft="4dp" 
/> 
</LinearLayout> 
+0

In che cosa questo codice risolve qualcosa? – jfcartier

2

Lavora con RealtiveLayout (senza obbligo ma invece di FrameLayout e utilizzare Android: scaleType = "fitXY". Spostare imageView su RealtiveLayout che contiene le visualizzazioni di testo android: id = "@ + id/HeaderList" e rimuovere lo sfondo android: background = "@ drawable/header" a questo livello.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
     android:id="@+id/principal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/header" > 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:id="@+id/HeaderList" 
     android:layout_gravity="top" 
     android:layout_height="wrap_content" > 


     <ImageView 
      android:id="@+id/backImg" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_centerInParent="true" 
      android:adjustViewBounds="true" 
      android:background="@color/blancotransless" 
      android:src="@drawable/header" 
      android:scaleType="fitXY" > 
     </ImageView> 

      <TextView 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:id="@+id/NameText" 
       android:text="John Doe" 
       android:textColor="#FFFFFF" 
       android:textSize="30sp" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentTop="true" 
       android:paddingLeft="4dp" 
       android:paddingTop="4dp" 
       /> 
      <TextView 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:textColor="#FFFFFF" 
       android:layout_alignParentLeft="true" 
       android:id="@+id/HoursText" 
       android:text="170 hours" 
       android:textSize="23sp" 
       android:layout_below="@+id/NameText" 
       android:paddingLeft="4dp" 
       /> 
     </RelativeLayout> 
     </RelativeLayout> 

Più o meno dovrebbe funzionare!

3

Puoi provare questo trucco,

  • FrameLayout (wrapcontent, wrapcontent)
    • ImageView (partita genitore, match genitore) // suo lo sfondo
    • LinearLayout (wrapcontent, wrapcontent)
      • Tutti i contenuti va dentro questo layout lineare o qualsiasi altro tipo cosa mai si vuole
+3

Per me, semplicemente non funziona, perché ImageView è più grande del suo contenitore :( – Richard

+0

È possibile definire le dimensioni di ImageView ... e utilizzare scaleType per adattarsi all'immagine di conseguenza – Umair

55

Ho avuto lo stesso problema (credo), e l'unico La soluzione che ho trovato è stata questa:

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    > 

    <View 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/some_image" 
     android:layout_alignTop="@+id/actual_content" 
     android:layout_alignBottom="@id/actual_content" 
     android:layout_alignLeft="@id/actual_content" 
     android:layout_alignRight="@id/actual_content" 
     /> 

    <LinearLayout 
     android:id="@id/actual_content" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     > 

     <!-- more stuff ... --> 

    </LinearLayout> 

</RelativeLayout> 
+9

questo ha funzionato con alcune modifiche per me. - usato ImageView invece di View - aggiunto android: scaleType = "fitXY" a ImageView – kev

+2

Per le persone che non vogliono perdere 10 minuti, per referenziare la vista dichiarata dopo, è necessario aggiungere un'istanza '@ + id /' di '@ id /' per creare l'ID. –