Вертикальная линия с использованием XML-drawable

Я пытаюсь понять, как определить вертикальную линию (толщиной 1dp), которая будет использоваться в качестве переносимого.

Чтобы сделать горизонтальный, это довольно просто:

<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>

Вопрос в том, как сделать эту строку вертикальной?

Да, есть обходные пути, такие как рисование прямоугольника с толщиной 1px, но это усложняет извлекаемый XML, если он состоит из нескольких элементов <item>.

У кого-нибудь был такой шанс?

UPDATE

Дело до сих пор не разрешено. Однако, Для тех, кто находится в креасиде документации на Android, вы можете найти это полезным: Отсутствует руководство по XML для Android

UPDATE

Я не нашел другого способа, кроме того, который был отмечен как правильный. Он делает трюк, хотя чувствует себя немного "тяжелым", поэтому, если вы случайно знаете ответ, не забудьте поделиться;)

Ответ 1

Вместо формы вы можете попробовать View:

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

Я использовал это только для горизонтальных линий, но я бы подумал, что он будет работать и для вертикальных линий.

Использование:

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

для горизонтальной линии.

Ответ 2

Вы можете вставить свою фигуру во вращающийся тег.

<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>

Однако единственной проблемой являются параметры макета, определенные в вашем макете xml, будут измерениями, используемыми для рисования исходной фигуры. Если вы хотите, чтобы ваша линия была 30dp высотой, вам нужно определить layout_width из 30dp в вашем макете xml. Но конечная ширина также будет 30dp в этом случае, что, вероятно, нежелательно для большинства ситуаций. Это по существу означает, что ширина и высота должны быть одного и того же значения, значение вашей желаемой длины для линии. Я не мог понять, как это исправить.

Это похоже на решение "android way", но если не существует какого-либо исправления или обходного пути для проблемы с размерами, о которой я упоминаю, это вряд ли будет работать для большинства людей. Нам действительно нужен атрибут ориентации в < shape/ > или < ход / > .

Вы также можете попробовать ссылаться на другие доступные в атрибутах поворота теги, например:

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

Однако я не тестировал это и ожидал, что у него будут те же проблемы.

- EDIT -

О, я действительно понял, что исправить. Вы можете использовать отрицательный запас в своем макете xml, чтобы избавиться от нежелательного дополнительного пространства. Например:

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

Ответ 3

<?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>

Работайте для меня. Поместите это как фон вида с fill_parent или фиксированным размером в dp height

Ответ 4

Вы можете использовать атрибут 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>

Ответ 5

Я придумал другое решение. Идея состоит в том, чтобы заполнить выталкиваемый сначала цветом, который нравится линии, а затем снова заполнить всю область цветом фона при использовании левой или правой прокладки. Очевидно, что это работает только для вертикальной линии в левом или правом левом направлении.

<?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>

Ответ 6

Я думаю, что это самое простое решение:

<?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>

Ответ 7

Мне нужно было добавить мои представления динамически/программно, поэтому добавление дополнительного представления было бы громоздким. Моя высота просмотра была WRAP_CONTENT, поэтому я не мог использовать решение прямоугольника. Я нашел blog-post здесь о расширении TextView, переопределении onDraw() и рисовании в строке, поэтому я реализовал это, и он работает хорошо. Смотрите мой код ниже:

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);
    }
}

Мне нужна вертикальная линия слева, но параметры drawline drawLine(startX, startY, stopX, stopY, paint), поэтому вы можете рисовать любую прямую линию в любом направлении по представлению. Тогда в моей деятельности у меня есть NoteTextView note = new NoteTextView(this); Надеюсь это поможет.

Ответ 8

его очень просто... для добавления вертикальной линии в 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"/>

Ответ 9

Зависит от того, где вы хотите иметь вертикальную линию, но если вы хотите, например, вертикальную рамку, у родительского представления есть фон, который может быть выделен пользователем. И вы можете затем определить способ рисования следующим образом:

<?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>

В этом примере будет создана тонкая черная линия 1dp с правой стороны представления, которая будет иметь эту возможность в качестве фона.

Ответ 10

Вы можете использовать фигуру, но вместо строки сделать ее прямоугольной.

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

и в вашем макете используйте это...

<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"/>

Возможно, вам придется играть с шириной, в зависимости от размера тире, чтобы получить ее в одну строку.

Надеюсь, что это поможет Приветствия

Ответ 11

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>

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

Ответ 12

<?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>

Ответ 13

Чтобы сделать вертикальную линию, просто используйте прямоугольник шириной 1dp:

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

Не используйте stroke, используйте solid (который является цветом заливки), чтобы указать цвет строки.

Ответ 14

Вы должны использовать как это:

<View
android:layout_width="1dp"
android:layout_height="match_parent"

android:background="@color/black" />

Ответ 15

Похоже, никто не упомянул эту опцию:

<?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>

Ответ 16

Я создал RelativeLayout с LinearLayout и View as childs. LinearLayout (я не знаю, может ли это быть RelativeLayout также) содержит представления как обычные, а View - это строка.

Здесь код:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true">

        <-- Your views here -->

    </LinearLayout>

    <View
        android:layout_width="1dp"
        android:layout_height="fill_parent"
        android:background="#000000"
        android:layout_alignParentRight="true" />

</RelativeLayout>

Ответ 17

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

        android:background="#ffffff"
        android:padding="10dp" />`

Ответ 18

Очень просто, и я думаю, что лучший подход.

<TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Section Text"
            android:id="@+id/textView6"
            android:textColor="@color/emphasis"
            android:drawableBottom="@drawable/underline"/>

underline.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="rectangle">
      <size android:width="1000dp" android:height="2dp" />
      <solid android:color="@color/emphasis"/>
</shape>