2010-03-11 8 views
76

È possibile creare un oggetto forma Android con tratto solo su determinati lati?Tratto Android su lato aperto?

Ad esempio ho:

<stroke 
android:width="3dip" 
android:color="#000000" 
    android:dashWidth="10dip" 
    android:dashGap="6dip" /> 

che è simile a questo CSS:

border: 3px dashed black; 

Come posso impostare la corsa su un solo lato? Questo è come lo farei in CSS:

border-left: 3px dashed black; 

Come si fa in XML Android?

risposta

37

Ho risolto questo utilizzando un elenco-strato, combinando due forme, una delle quali con altezza 1dp posta sul fondo

optionscreen_bottomrectangle.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- This is the line --> 
<item> 
     <shape> 
      <solid android:color="#535353" /> 
     </shape> 
</item> 
<!-- This is the main color --> 
<item android:bottom="1dp"> 
    <shape> 
      <solid android:color="#252525" /> 
    </shape> 
</item> 
</layer-list> 

Poi, nel layout/main .xml

<TextView 
    android:id="@+id/bottom_rectangle" 
    android:background="@drawable/optionscreen_bottomrectangle" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_below="@id/table_options" 
    android:layout_above="@id/exit_bar"/> 

che colma il divario tra table_options e exit_bar con una priorità bassa e poco prima exit_bar stampa una riga 1DP. Questo ha fatto il trucco per me, spero che aiuti qualcun altro.

Risposta modificata per posizionare i livelli nell'ordine corretto. Grazie Alex!

+0

Potrebbe essere utile non pubblicare una risposta se si vuole davvero avere una risposta da soli. Quando gli altri sviluppatori vedono che c'è già una risposta (anche se in questo caso è in realtà non) non sono così inclini a rispondere. – MrSnowflake

+0

Ho modificato la risposta con informazioni utili. – Maragues

25

@ risposta di Maragues è indietro, come layer-list drawable attingono dall'alto verso il basso (cioè l'ultimo elemento della lista viene disegnato sulla parte superiore):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- This is the line --> 
<item> 
     <shape> 
      <solid android:color="#535353" /> 
     </shape> 
</item> 
<!-- This is the main color --> 
<item android:bottom="1dp"> 
    <shape> 
      <solid android:color="#252525" /> 
    </shape> 
</item> 

</layer-list> 

Questo riempirà in modo efficace la forma con la linea colore, quindi disegnare il colore di sfondo sopra di esso, lasciando l'ultimo 1dp chiaro per il colore della linea da mostrare.

109

ho raggiunto una buona soluzione con questo:

<?xml version="1.0" encoding="utf-8"?> 

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- This is the line --> 
    <item android:top="-1dp" android:right="-1dp" android:left="-1dp"> 
     <shape> 
      <solid android:color="@android:color/transparent" /> 
      <stroke android:width="1dp" android:color="#ffffff" /> 
     </shape> 
    </item> 

</layer-list> 

Questo metodo funziona bene nel caso in cui avete bisogno di uno sfondo trasparente ma pur sempre un colore del tratto aperto (Nel mio caso ho solo bisogno di una linea di fondo). Se hai bisogno di un colore di sfondo puoi aggiungere un colore solido come nella risposta Maragues.

EDIT 1

volte, per dispositivi elevata densità, utilizzando valori bassi dip può finire con tratti molto sottili o invisibili o distanze. Questo potrebbe accadere anche durante l'impostazione dei divisori ListView.

La soluzione più semplice consiste nell'utilizzare una distanza di 1px anziché 1p. Questo renderà la linea sempre visibile a tutte le densità. La soluzione migliore sarebbe creare risorse di dimensione per ogni densità, per ottenere le dimensioni migliori per ciascun dispositivo.

Edit 2

Divertente, ma ho cercato di utilizzare questo 6 anni più tardi, e non riesco a ottenere un buon risultato sui dispositivi Lollipop.

Probabilmente la soluzione corrente è utilizzare 9 patch. Android avrebbe dovuto creare una soluzione facile per questo problema dopo tutto questo tempo.

+0

questo ha funzionato per me – JoeLallouz

+0

Questo ha funzionato anche per me, ma non so esattamente perché ho dovuto usare -2dp invece di -1dp. Se usassi quest'ultimo, potrei vedere una linea sottile. –

+1

@EduZamora sì, sembra che per i dispositivi ad alta densità -1dp non funzioni come previsto – htafoya

28

Un'altra presa sulle altre risposte utilizzando il riempimento. Questo piccolo snipplet crea un bordo in alto e in basso.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- This is the line --> 
    <item> 
      <shape> 
       <padding android:left="0dp" android:top="1dp" android:right="0dp" android:bottom="1dp"/> 
       <solid android:color="#898989" /> 
      </shape> 
    </item> 
    <!-- This is the main color --> 
    <item> 
     <shape> 
      <solid android:color="#ffffff" /> 
     </shape> 
    </item> 
</layer-list> 
+4

Questa è di gran lunga la migliore risposta se hai bisogno di angoli arrotondati. –

+0

Anche questo mi ha aiutato moltissimo. Si prega di fare un tentativo e upvote – Boy

+0

@ug_ Penso che questo sia l'approccio migliore. Funziona perfettamente, grazie –

2
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 


<item> 
    <shape android:shape="rectangle" > 
     <stroke android:width="2dp" 
       android:color="#BBBBBB" /> 
     <solid android:color="@android:color/transparent" /> 
    </shape> 
</item> 
<item android:bottom="2dp" > 
    <shape android:shape="rectangle" > 
     <stroke android:width="2dp" 
       android:color="@color/main_background_color" /> 
     <solid android:color="@android:color/transparent" /> 
    </shape> 
</item> 

24

So che questa domanda è stata pubblicata tempo fa, quindi la risposta non sarà utilizzato dalla persona che ha postato questa domanda, ma può comunque aiutare gli altri.

<?xml version="1.0" encoding="UTF-8"?> 
    <!-- inset is used to remove border from top, it can remove border from any other side--> 
    <inset xmlns:android="http://schemas.android.com/apk/res/android" 
     android:insetTop="-2dp" 
     > 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle"> 
     <stroke android:width="1dp" android:color="#b7b7b7" /> 
     <corners android:bottomRightRadius="5dp" android:bottomLeftRadius="5dp"/> 

     <solid android:color="#454444"/> 
    </shape> 
    </inset> 

utilizzare il tag inset e dare un valore negativo per il bordo laterale che si desidera rimuovere.

I valori possibili sono:

android:insetTop="-1dp" android:insetBottom="-1dp" android:insetLeft="-1dp" android:insetRight="-1dp"

+0

risposta molto utile !!!!!!!!!!! –

+0

Questo è bello, grazie. – Tunga

+0

Lovvvvvvvvvely! – Benten

1

Ho usato seguente codice.

<?xml version="1.0" encoding="UTF-8"?> 
<!-- inset is used to remove border from top, it can remove border from any other side--> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetTop="-2dp" android:insetLeft="-2dp" android:insetRight="-2dp" 
    > 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle"> 
     <stroke android:width="1dp" android:color="@color/colorPrimary" /> 
     <solid android:color="#0000"/> 
     <padding android:left="2dp" android:top="2dp" android:bottom="2dp" android:right="2dp"/> 
    </shape> 
</inset>