Linea verticale usando XML disegnabile


162

Sto cercando di capire come definire una linea verticale (1dp di spessore) da usare come un disegno.

Per farne uno orizzontale, è piuttosto semplice:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
    <stroke android:width="1dp" android:color="#0000FF"/>
    <size android:height="50dp" />     
</shape>

La domanda è: come rendere verticale questa linea?

Sì, ci sono soluzioni alternative, come disegnare una forma rettangolare di 1px di spessore, ma ciò complica l'XML disegnabile, se è composto da più <item>elementi.

Qualcuno ha avuto qualche possibilità con questo?

AGGIORNARE

Il caso è ancora irrisolto. Tuttavia, per chiunque abbia una crociata di documentazione su Android, potresti trovare questo utile: Manuale XML di Android mancante

AGGIORNARE

Non ho trovato altro modo diverso da quello che ho contrassegnato come corretto. Fa il trucco anche se sembra un po '"pesante", quindi se ti capita di conoscere la risposta non dimenticare di condividere;)

Risposte:


394

Invece di una forma, potresti provare a View:

<View
    android:layout_width="1dp"
    android:layout_height="fill_parent"
    android:background="#FF0000FF" />

L'ho usato solo per le linee orizzontali, ma penso che funzionerebbe anche per le linee verticali.

Uso:

<View
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:background="#FF0000FF" />

per una linea orizzontale.


4
grazie Marco :)! Sono consapevole di poter utilizzare una vista per raggiungere questo obiettivo. Il fatto è che sto assemblando una vista un po 'più complessa che voglio usare come disegno per lo sfondo di una cella di tabella. Ci sono diversi tipi di forme / gradienti / linee lì. Usare una vista DOVREBBE essere una soluzione, tuttavia dovrei metterlo in un "layer" di disegno diverso e che potenzialmente ti spari nel piede quando incontrerò il ridimensionamento, ecc. Mi chiedo solo perché non ci sia documentazione sul " forma "xmls, forse qualcuno di google potrebbe illuminarci? :)
Kaspa,

1
L'uso di marginRight / Start e Left / End è talvolta interessante per ottenere spazio sui lati.
George,

108

Puoi annidare la tua forma all'interno di un tag di rotazione.

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90">
    <shape 
        android:shape="line">
        <stroke
            android:width="1dp"
            android:color="#ff00ff"
            android:dashWidth="1dp"
            android:dashGap="2dp" />
    </shape>
</rotate>

Tuttavia, l'unico problema è che i parametri di layout definiti nel tuo xml di layout saranno le dimensioni utilizzate per disegnare la forma originale. Significa che se vuoi che la tua linea sia alta 30dp, devi definire un layout_width di 30dp nel tuo layout xml. Ma la larghezza finale sarà anche 30dp in quel caso, il che è probabilmente indesiderabile per la maggior parte delle situazioni. Ciò significa essenzialmente che sia la larghezza che l'altezza devono avere lo stesso valore, il valore della lunghezza desiderata per la linea. Non sono riuscito a capire come risolvere questo problema.

Questa sembra essere la soluzione "Android Way", ma a meno che non ci sia qualche soluzione o soluzione per il problema delle dimensioni che menziono, probabilmente questo non funzionerà per la maggior parte delle persone. Ciò di cui abbiamo veramente bisogno è un attributo di orientamento in <forma /> o <tratto />.

Puoi anche provare a fare riferimento a un altro drawable negli attributi del tag di rotazione, come:

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90"
    android:drawable="@drawable/horizontal_line" />

Tuttavia non l'ho provato e mi aspetto che abbia gli stessi problemi.

-- MODIFICARE --

Oh, in realtà ho capito una soluzione. È possibile utilizzare un margine negativo nel layout xml per eliminare lo spazio extra indesiderato. Ad esempio:

<ImageView
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_marginLeft="-15dp"
    android:layout_marginRight="-15dp"
    android:src="@drawable/dashed_vertical_line" />

4
mentre il margine negativo funzionerà per il 99% dei dispositivi .... sappi solo che ci sono dispositivi che forzano la chiusura se lo fai. Alcuni dispositivi hanno difficoltà a gonfiare un margine negativo
Kent Andersen il

2
@cephus Uso il tuo primo codice, ma ho bisogno della riga in cima alla vista. È al centro della mia vista. Come posso impostare una gravità per esso (all'interno del file xml di forma)?
Behzad,

20

È possibile utilizzare l'attributo rotate

 <item>
    <rotate
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%" >
        <shape
            android:shape="line"
            android:top="1dip" >
            <stroke
                android:width="1dip"
                 />
        </shape>
    </rotate>
</item>

6
Questa è sicuramente una risposta migliore (o migliore) perché, mentre la risposta di @ commonsware è sufficiente per le normali linee verticali. Se non vogliamo creare linee tratteggiate (diciamo ad esempio), questa è l'unica risposta che funzionerebbe correttamente.
Sottomarino Sebastian,

16
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle" >
    <stroke android:width="1dp" android:color="@color/white" />
    <size android:width="2dp" />
</shape>

Per me va bene . Mettilo come sfondo della vista con fill_parent o dimensioni fisse in altezza dp


12

Ho trovato una soluzione diversa. L'idea è di riempire prima il disegno con il colore che ti piace essere la linea e quindi riempire di nuovo l'intera area con il colore di sfondo mentre usi l'imbottitura sinistra o destra. Ovviamente questo funziona solo per una linea verticale nell'estrema sinistra o destra del tuo disegno.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/divider_color" />
    <item android:left="6dp" android:drawable="@color/background_color" />
</layer-list>

Avevo bisogno di uno sfondo con bordi a sinistra, a destra, in basso e questo ha funzionato per me, grazie!
Andrii Chernenko,

Fantastico, con questo sono riuscito a creare divisori ordinati nel mio LinearLayout ( showDividers="middle"). Per ottenere un divisore 2dp, dovevo specificare android:left="3dp"qui.
Jonik,

Suggerimento: per rendere questo disegno utile più in generale, utilizzare @android:color/transparentinvece di hardcoding @color/background_color.
Jonik,

In realtà per le mie esigenze di divisore verticale, questa soluzione è ancora più semplice . :)
Jonik il

@Jonik Certo, ma funziona solo con una vista ad altezza fissa, non con wrap_content.
Eric Kok,

10

Penso che questa sia la soluzione più semplice:

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

    <item
        android:gravity="center">
        <shape android:shape="rectangle">
            <size android:width="1dp" />
            <solid android:color="#0000FF" />
        </shape>
    </item>

</layer-list>

Meraviglioso. Aggiungi android:heighta sizese vuoi controllare anche quella dimensione.
Giulio Piancastelli,

4

Avevo bisogno di aggiungere le mie viste in modo dinamico / programmatico, quindi aggiungere una vista in più sarebbe stato complicato. La mia altezza della vista era WRAP_CONTENT, quindi non potevo usare la soluzione rettangolare. Ho trovato un blog-post qui di estendere TextView, sovrascrivendo OnDraw () e la pittura in linea, in modo che ho implementato e funziona bene. Vedi il mio codice qui sotto:

public class NoteTextView extends TextView {
    public NoteTextView(Context context) {
       super(context);
    }
    private Paint paint = new Paint();
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.parseColor("#F00000FF"));
        paint.setStrokeWidth(0);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawLine(0, 0, 0, getHeight(), paint);
    }
}

Avevo bisogno di una linea verticale a sinistra, ma i parametri di drawline sono in drawLine(startX, startY, stopX, stopY, paint)modo da poter disegnare qualsiasi linea retta in qualsiasi direzione attraverso la vista. Quindi, nella mia attività, NoteTextView note = new NoteTextView(this); spero che questo aiuti.


3

è molto semplice ... per aggiungere una linea verticale in Android XML ...

<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:rotation="90"
android:background="@android:color/darker_gray"/>

Funziona alla grande quando non puoi usare fill_parent per l'altezza perché l'altezza del genitore è impostata su wrap_content.
Sergey Aldoukhov,

2

Dipende da dove si desidera avere la linea verticale, ma se si desidera ad esempio un bordo verticale, è possibile avere la vista padre avere uno sfondo un disegno personalizzabile. E puoi quindi definire il disegno in questo modo:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape
            android:shape="rectangle">
            <stroke android:width="1dp" android:color="#000000" />
            <solid android:color="#00ffffff" />

        </shape>
    </item>

    <item android:right="1dp">
        <shape android:shape="rectangle">
            <solid android:color="#00ffffff" />
        </shape>
    </item>

</layer-list>

Questo esempio creerà una sottile linea nera di 1dp sul lato destro della vista, che avrà questo disegno come sfondo.


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

    <item
        android:bottom="-3dp"
        android:left="-3dp"
        android:top="-3dp">

        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary" />
            <stroke
                android:width="2dp"
                android:color="#1fc78c" />
        </shape>

    </item>

</layer-list>

2

Sembra che nessuno abbia menzionato questa opzione:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/white" android:width="1dp"/>
</layer-list>

1

Puoi usare una forma ma invece di una linea trasformala in rettangolo.

android:shape="rectangle">
<stroke
    android:width="5dp"
    android:color="#ff000000"
    android:dashGap="10px"
    android:dashWidth="30px" />

e nel tuo layout usa questo ...

<ImageView
    android:layout_width="7dp"
    android:layout_height="match_parent"
    android:src="@drawable/dashline"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layerType="software"/>

Potrebbe essere necessario giocare con la larghezza, a seconda della dimensione dei trattini, per inserirlo in un'unica riga.

Spero che questo aiuti Saluti


1
add this in your styles.xml

        <style name="Divider">
            <item name="android:layout_width">1dip</item>
            <item name="android:layout_height">match_parent</item>
            <item name="android:background">@color/divider_color</item>
        </style>

        <style name="Divider_invisible">
            <item name="android:layout_width">1dip</item>
            <item name="android:layout_height">match_parent</item>
        </style>

then wrap this style in a linear layout where you want the vertical line, I used the vertical line as a column divider in my table. 

     <TableLayout
                android:id="@+id/table"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:stretchColumns="*" >

                <TableRow
                    android:id="@+id/tableRow1"
                    android:layout_width="fill_parent"
                    android:layout_height="match_parent"
                    android:background="#92C94A" >

                    <TextView
                        android:id="@+id/textView11"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp" />
    //...................................................................    

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider_invisible" />
                    </LinearLayout>
        //...................................................................
                    <TextView
                        android:id="@+id/textView12"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/main_wo_colon"
                        android:textColor="@color/white"
                        android:textSize="16sp" />
  //...............................................................  
                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

    //...................................................................
                    <TextView
                        android:id="@+id/textView13"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/side_wo_colon"
                        android:textColor="@color/white"
                        android:textSize="16sp" />

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

                    <TextView
                        android:id="@+id/textView14"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/total"
                        android:textColor="@color/white"
                        android:textSize="16sp" />
                </TableRow>

                <!-- display this button in 3rd column via layout_column(zero based) -->

                <TableRow
                    android:id="@+id/tableRow2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#6F9C33" >

                    <TextView
                        android:id="@+id/textView21"
                        android:padding="5dp"
                        android:text="@string/servings"
                        android:textColor="@color/white"
                        android:textSize="16sp" />

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

    ..........
    .......
    ......

0

Per creare una linea verticale, basta usare un rettangolo con una larghezza di 1dp:

<shape>
    <size
        android:width="1dp"
        android:height="16dp" />
    <solid
        android:color="#c8cdd2" />
</shape>

Non utilizzare stroke, utilizzare solid(che è il colore "riempimento") per specificare il colore della linea.


-1
 <View
        android:layout_width="2dp"
        android:layout_height="40dp"

        android:background="#ffffff"
        android:padding="10dp" />`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.