2012-01-12 11 views
13

Ho un obiettivo semplice. Voglio uno sfondo grigio chiaro sul mio FrameLayout con una linea di divisione nera al di sotto di essa (solo sotto la terra, non tutto intorno). Finora ho questo:Come ottenere il "fondo" della gravità lavorando su un drawable in xml

<?xml version="1.0" encoding="utf-8"?> 
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <shape android:shape="rectangle" android:gravity="center"> 
     <solid android:color="#EEEEEE" /> 
    </shape> 
    </item> 
    <item> 
    <shape android:shape="line" android:gravity="bottom" > 
     <stroke android:width="1dip" android:color="#010101"/> 
    </shape> 
    </item> 
    </layer-list> 

Ma disegna la linea attraverso il centro, cioè ignora la gravità = 'bottom' bit. Come posso risolvere questo?

MODIFICA: Questa domanda è molto vecchio. La risposta selezionata può essere o non essere in linea con le API attuali, ecc. Si consiglia di iniziare la propria domanda piuttosto che aggiungere a questa, che non è più monitorata.

risposta

5

Mi consiglia di utilizzare un'immagine di nove patch per questo - ecco un esempio che dovrebbe fare il lavoro:

Example nine-patch image

(! E 'molto piccolo solo, ma è lì)

Se posizionalo nella tua cartella drawable e imposta lo sfondo di FrameLayout su di esso, quindi dovresti ottenere il risultato desiderato. Il contenuto andrà nell'area grigia e il pixel # 010101 verrà allungato orizzontalmente per formare una linea nella parte inferiore. Assicurati di mantenere l'estensione .9.png per assicurarti che venga caricata come nove patch.

Speranza che ti aiuta

+1

Questo è un buon punto, ho potuto farlo in quel modo. In effetti, lo farò, ma sarei ancora interessato a sapere a caldo per far funzionare il tag gravità per quella linea - mi sembra una soluzione molto più bella ma grazie per il tuo suggerimento. –

+1

Nessuna menzione del tag gravità [qui] (http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html).Non riesco a vedere alcun modo per ottenere questo risultato usando puro xml, potresti creare ShapeDrawable nel codice e impostare i suoi limiti in base ai limiti del layout? – kingraam

17

Purtroppo non ho trovato un modo per ottenere la gravità di lavoro per drawable, ma ho trovato come si può ottenere quello che vuoi con puro xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:top="-2dp" 
     android:left="-2dp" 
     android:right="0dp" 
     android:bottom="1dp" 
     > 
     <shape android:shape="rectangle"> 
      <solid android:color="#EEEEEE"/> 
      <stroke android:width="1dp" android:color="#010101"/> 
     </shape> 
    </item> 
</layer-list> 

Buona fortuna :)

+1

usman

22

Ho lottato molto anche con questo. Fondamentalmente, per creare un bordo in basso, devi pensare in direzione opposta a quello che ti aspetti. Si inizia con un rettangolo con il colore del bordo. Oltre a ciò, si disegna il colore reale, con un offset dal basso. Io uso questo:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

    <!-- CREATE A RECTANGLE WITH YOUR BORDER COLOR --> 
    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="#fff"/> 
     </shape> 
    </item> 

    <!-- NOW DEFINE THE NORMAL COLOR--> 
    <item android:bottom="BOTTOM_BORDER_THICKNESS E.G. 4dp"> 
     <shape android:shape="rectangle" > 
      <solid android:color="#ccc"/> 
     </shape> 
    </item> 
</layer-list> 

Oppure, come ha suggerito Juan Pablo Saraceno:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <color android:color="YOUR_BORDER_COLOR" /> 
    </item> 
    <item android:top="YOUR_BORDER_THICKNESS"> 
     <color android:color="YOUR_BG_COLOR" /> 
    </item> 
</layer-list> 
+3

Questo è davvero un buona risposta e merita di essere IMHO una posizione migliore. Penso che sia un po 'un peccato che Android non supporti la gravità nel modo giusto e costringa a farlo. Ha funzionato per me anche usando i tag anziché il rettangolo, le forme, quindi ancora più semplice.

+5

l'unico problema è che genera overdraw, perché si sta disegnando un rettangolo pieno con il colore della vostra bordo solo per amplificare con l'attuale rettangolo. Senza vera gravità, vince ancora 9 patch. –

+1

Non funzionerà se è necessaria una parte superiore traslucida e una parte inferiore solida. Quindi suppongo che * dovrò * lavorare con una nove patch? –

1
<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/Black" /> 
     </shape> 
    </item> 
    <item android:bottom="5dp"> 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/White" /> 
     </shape> 
    </item> 

</layer-list> 
2

Questo funziona!

<item> 
     <bitmap 
     android:gravity="left|bottom" 
     android:src="@drawable/myDrawable" /> 
</item> 
+0

Nop non per ShapeDrawable perché è un drawable, non un Bitmap. – nsvir

1

Beh, è ​​abbastanza vecchia questione, ma nessuna delle risposte sembrano rispondere alla domanda effettiva (come fare gravity lavoro) quindi ecco un esempio di lavoro:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item> 
     <color android:color="#2196F3"/>  <!-- Background color --> 
    </item> 

    <item android:gravity="bottom"> 
     <shape> 
      <size android:height="10dp" />  <!-- I would suggest 1dp --> 
      <solid android:color="#F50057" /> <!-- Line color --> 
     </shape> 
    </item> 
</layer-list> 

Per analogia, se si desidera utilizzare gravità left o right cambiamento attributo height a width

Problemi correlati