2010-04-17 4 views
120

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

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

<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 документации крестового похода - Вы могли бы найти это полезным: Missing Android XML Manual

UPDATE

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

ответ

319

Вместо формы, вы можете попробовать 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

благодарит Mark :)! Я знаю, что я могу использовать представление для достижения этого. Дело в том, что я собираю немного более сложный вид, который я хочу использовать в качестве чертежа для фона ячейки таблицы. Существуют разные типы фигур/градиентов/линий. Использование представления было бы решением, однако мне пришлось бы поместить его в другой «слой» рисунка и, возможно, стрелять себе в ногу, когда я натолкнулся на изменение размера и т. Д. Интересно, почему нет документации по «форма» xmls, может быть, кто-то из Google мог бы просветить нас? :) – Kaspa

+0

Использование marginRight/Start и Left/End также иногда интересно получить пространство по сторонам. – George

86

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

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

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

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

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

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

, в то время как отрицательная маржа будет работать на 99% устройств ... просто знайте, есть устройства, которые будут принудительно закрывать, если вы это сделаете. У некоторых устройств есть проблема с раздуванием отрицательного поля –

+0

@cephus Я использую ваш первый код, но мне нужна линия поверх представления. Это в центре моего взгляда. Как я могу установить гравитацию для него (внутри XML-файла формы)? – Behzad

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

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

9

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

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

Мне нужен фон с границами слева, справа, снизу, и это сработало для меня, спасибо! –

+0

Удивительный, с этим мне удалось создать аккуратные разделители в моем LinearLayout ('showDividers =" middle "'). Чтобы получить разделитель 2dp, мне нужно было указать 'android: left =" 3dp "' здесь. – Jonik

+0

Совет: чтобы сделать этот чертеж полезным в более общем плане, используйте '@android: color/transparent' вместо hardcoding' @ color/background_color'. – Jonik

1

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

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

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

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

3

его очень просто ... , чтобы добавить вертикальную линию в андроиде XML ...

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

Это отлично работает, когда вы можете " t используйте fill_parent для высоты, потому что для родительской высоты установлено значение wrap_content. –

2

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

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

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

    .......... 
    ....... 
    ...... 
-2

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

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

подчеркивание.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> 
+0

Это горизонтальная линия, а не вертикальная линия. –

+0

Кроме того, андроид не требуется: width = "1000dp". Просто оставьте это. –

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

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

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

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

Пожалуйста, объясните немного больше, почему это лучший ответ ... – fijas

+5

Это, безусловно, лучший (или лучший) ответ, потому что, хотя ответ @ commonsware достаточно для обычных вертикальных линий. Если мы не создадим пунктирные линии (скажем, например), это единственный ответ, который будет работать правильно. –

0

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

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

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

Смежные вопросы