使用XML drawable的垂直线

时间:2010-04-17 14:57:02

标签: android android-layout line android-xml android-drawable

我正在试图找出如何定义一条垂直线(1dp厚)作为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厚的矩形形状,但如果它包含多个<item>元素,则会使可绘制XML变得复杂。

有人有机会这个吗?

更新

案件尚未解决。然而, 对于Android文档运动中的任何人 - 您可能会发现这很有用: Missing Android XML Manual

更新

除了我标记为正确的那个之外,我找不到别的办法。它虽然感觉有点“沉重”,但是如果你碰巧知道答案就不要忘记分享;)

19 个答案:

答案 0 :(得分:350)

您可以尝试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" />

表示水平线。

答案 1 :(得分:96)

您可以将形状嵌套在旋转标记内。

<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,则需要在布局xml中定义layout_width为30dp。但在这种情况下,最终宽度也将是30dp,这在大多数情况下可能是不合需要的。这实际上意味着宽度和高度必须是相同的值,即线所需长度的值。我无法弄清楚如何解决这个问题。

这似乎是“android方式”解决方案,但除非我提到维度问题的某些修复或解决方法,否则这可能对大多数人不起作用。我们真正需要的是&lt; shape /&gt;中的方向属性。或者&lt; stroke /&gt;。

您还可以尝试在旋转标记的属性中引用另一个drawable,例如:

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

答案 2 :(得分: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>

为我工作。将其作为视图的背景使用fill_parent或固定大小的dp高度

答案 3 :(得分:14)

您可以使用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>

答案 4 :(得分:10)

我想出了一个不同的解决方案。我们的想法是首先使用您喜欢的线条填充可绘制的颜色,然后使用左侧或右侧填充再次使用背景颜色填充整个区域。显然,这仅适用于您的drawable最左侧或右侧的垂直线。

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

答案 5 :(得分:4)

我需要动态/编程地添加我的视图,因此添加额外的视图会很麻烦。我的视图高度是WRAP_CONTENT,所以我无法使用矩形解决方案。我发现了一篇关于扩展TextView的博客文章here,覆盖了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); 希望这可以帮助。

答案 6 :(得分:4)

非常简单...... 在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"/>

答案 7 :(得分:2)

取决于您想要垂直线的位置,但是如果您想要一个垂直边框,则可以让父视图的背景为自定义可绘制。然后你可以像这样定义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细黑线,将其作为背景绘制。

答案 8 :(得分:2)

我认为这是最简单的解决方案:

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

答案 9 :(得分:2)

似乎没有人提到此选项:

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

答案 10 :(得分: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"/>

您可能需要使用宽度,具体取决于破折号的大小,以使其成为一行。

希望这会有所帮助 干杯

答案 11 :(得分: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>

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

答案 12 :(得分:0)

我将这个 drawable 用于水平和垂直线

https://gist.github.com/UtkuGlsvn/410ffb867bef3d89e85bf6bbd57950c1

示例 xml:

<ImageView
        android:id="@+id/imageView9"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="15dp"
        android:src="@drawable/vertical_line"
        app:layout_constraintEnd_toEndOf="@+id/imageView7"
        app:layout_constraintStart_toStartOf="@+id/imageView7"
        app:layout_constraintTop_toBottomOf="@+id/imageView8" />

答案 13 :(得分:0)

根据此处的线程在 Android M 及更高版本中使用旋转可绘制时似乎存在错误:stackoverflow.com/a/8716798/3849039

在我看来,创建自定义视图是最好的解决方案。

下面的链接节省我的时间。

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

答案 14 :(得分:0)

尽管@CommonsWare的解决方案有效,但是不能使用它。 G。在layer-list可绘制对象中。结合使用<rotate><shape>的选项会导致大小问题。这是使用Android Vector Drawable的解决方案。此Drawable是1x10dp白线(可以通过修改widthheightstrokeColor属性进行调整):

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

要制作垂直线,只需使用宽度为1dp的矩形:

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

请勿使用stroke,使用solid(这是“填充”颜色)来指定该行的颜色。

答案 17 :(得分:-1)

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

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

答案 18 :(得分:-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"/>

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>