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

Я пытаюсь понять, как определить вертикальную линию (толщиной 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>

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

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

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

ОБНОВЛЕНИЕ

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

ОБНОВЛЕНИЕ

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


person Kaspa    schedule 17.04.2010    source источник


Ответы (14)


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

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

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

Использовать:

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

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

person CommonsWare    schedule 17.04.2010
comment
спасибо Марк :)! Я знаю, что могу использовать представление, чтобы достичь этого. Дело в том, что я собираю немного более сложное представление, которое хочу использовать в качестве рисунка для фона ячейки таблицы. Там есть разные типы форм / градиентов / линий. Использование представления БУДЕТ решением, однако мне пришлось бы поместить его в другой слой рисования, и это потенциально может привести к выстрелу себе в ногу, когда я столкнусь с изменением размера и т. Д. Интересно, почему нет документации по форме xmls, может кто из гугла нас просветит? :) - person Kaspa; 17.04.2010
comment
Использование marginRight / Start и Left / End также иногда интересно, чтобы освободить место по бокам. - person George; 03.10.2017

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

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

Похоже, что это решение «на андроид», но если нет какого-либо исправления или обходного пути для проблемы с размерами, о которой я упоминал, то это, вероятно, не сработает для большинства людей. Что нам действительно нужно, так это атрибут ориентации в ‹shape /› или ‹stroke /›.

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

<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" />
person cephus    schedule 22.09.2010
comment
в то время как отрицательный запас будет работать для 99% устройств ... просто знайте, есть устройства, которые принудительно закроют, если вы это сделаете. На некоторых устройствах возникают проблемы с увеличением отрицательного запаса - person Kent Andersen; 30.11.2012
comment
@cephus Я использую ваш первый код, но мне нужна строка поверх представления. Это в центре моего обзора. Как я могу установить для него гравитацию (внутри XML-файла формы)? - person Behzad; 10.01.2013

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

 <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>
person user4679242    schedule 17.03.2015
comment
Это определенно лучший (или лучший) ответ, потому что, хотя ответа @commonware достаточно для обычных вертикальных линий. Если мы не хотим рисовать пунктирные линии (скажем, например), это единственный ответ, который будет работать правильно. - person Subin Sebastian; 25.08.2015

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

person logcat    schedule 08.09.2012

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

<?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>
person a.ch.    schedule 10.05.2018
comment
Чудесно. Добавьте android:height к size, если вы хотите также контролировать это измерение. - person Giulio Piancastelli; 03.09.2019

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

<?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>
person Eric Kok    schedule 27.06.2013
comment
Мне нужен фон с границами слева, справа, снизу, и это сработало для меня, спасибо! - person Andrii Chernenko; 02.08.2013
comment
Замечательно, с этим мне удалось создать аккуратные разделители в моем LinearLayout (showDividers="middle"). Чтобы получить разделитель 2dp, мне нужно было указать здесь android:left="3dp". - person Jonik; 30.12.2013
comment
Совет: чтобы сделать эту возможность рисования более полезной, используйте @android:color/transparent вместо жесткого кодирования @color/background_color. - person Jonik; 30.12.2013
comment
На самом деле для моих нужд вертикального разделителя это решение еще проще. :) - person Jonik; 30.12.2013
comment
@Jonik Конечно, но это работает только с фиксированной высотой, а не с wrap_content. - person Eric Kok; 13.03.2014
comment
Вот совершенство этой техники: stackoverflow.com/questions/10457135/ - person Todd Freed; 21.08.2014

Мне нужно было добавлять представления динамически / программно, поэтому добавление дополнительного представления было бы обременительным. Моя высота обзора была 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); Надеюсь, это поможет.

person willlma    schedule 21.01.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"/>
person user3130068    schedule 23.12.2013
comment
Это отлично работает, когда вы не можете использовать fill_parent для высоты, потому что родительская высота установлена ​​на wrap_content. - person Sergey Aldoukhov; 15.11.2014

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

<?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 в правой части представления, которая будет иметь возможность рисования в качестве фона.

person Lukas1    schedule 07.05.2014

Похоже, никто не упомянул этот вариант:

<?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>
person Sergey Neskoromny    schedule 04.09.2019

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

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

and In your layout use this...

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

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

Надеюсь, это поможет. Ура

person Boxlady    schedule 06.11.2013

Хотя решение @ CommonsWare работает, его нельзя использовать. E. грамм. в layer-list растягиваемом. Варианты, сочетающие <rotate> и <shape>, вызывают проблемы с размером. Вот решение с использованием Android Vector Drawable. Этот Drawable представляет собой белую линию размером 1x10dp (можно настроить, изменив свойства width, height и strokeColor):

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:viewportWidth="1"
    android:viewportHeight="10"
    android:width="1dp"
    android:height="10dp">

    <path
        android:strokeColor="#FFFFFF"
        android:strokeWidth="1"
        android:pathData="M0.5,0 V10" />

</vector> 
person Miloš Černilovský    schedule 01.12.2020

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

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

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

person David Wasser    schedule 08.11.2017

Похоже, есть ошибка при использовании возможности поворота в Android M и выше в соответствии с потоком здесь: stackoverflow.com/a/8716798/3849039

По моему мнению, лучшим решением для этого является создание пользовательского представления.

Ссылка ниже сэкономит мое время.

https://gist.github.com/mlagerberg/4aab34e6f8bc66b1eef7/revisions

person sweet_vish    schedule 20.02.2021