Вертикальная линия с использованием XML Drawable - PullRequest
139 голосов
/ 17 апреля 2010

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

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

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

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

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

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

UPDATE

Дело до сих пор не раскрыто. Тем не мение, Для тех, кто участвует в крестовом походе по документации для Android - это может оказаться полезным: Руководство по XML для Android отсутствует

UPDATE

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

Ответы [ 14 ]

353 голосов
/ 17 апреля 2010

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

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

97 голосов
/ 23 сентября 2010

Вы можете вкладывать свою форму в тег поворота.

<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", но если я не упомяну о каком-либо исправлении или обходном пути для проблемы с размерами, это, вероятно, не сработает для большинства людей. Что нам действительно нужно, так это атрибут ориентации в или .

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

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

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

- РЕДАКТИРОВАТЬ -

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

<ImageView
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_marginLeft="-15dp"
    android:layout_marginRight="-15dp"
    android:src="@drawable/dashed_vertical_line" />
16 голосов
/ 08 сентября 2012
<?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

15 голосов
/ 17 марта 2015

Вы можете использовать атрибут поворота

 <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>
10 голосов
/ 27 июня 2013

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

<?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>
4 голосов
/ 10 мая 2018

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

<?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>
4 голосов
/ 23 декабря 2013

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

Мне нужно было добавлять свои представления динамически / программно, поэтому добавление дополнительного представления было бы громоздким. Высота моего вида была WRAP_CONTENT, поэтому я не мог использовать прямоугольное решение. Я нашел сообщение в блоге здесь о расширении 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(startX, startY, stopX, stopY, paint), поэтому вы можете нарисовать любую прямую линию в любом направлении поперек вида. Тогда в моей деятельности NoteTextView note = new NoteTextView(this); Надеюсь это поможет.

2 голосов
/ 07 мая 2014

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

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

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

1 голос
/ 20 июля 2018
<?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>
...