180

我试图弄清楚如何定义一条垂直线(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 厚的矩形,但如果它由多个<item>元素组成,这会使可绘制 XML 变得复杂。

有人有这个机会吗?

更新

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

更新

除了我标记为正确的方法之外,我没有发现其他方法。虽然感觉有点“沉重”,但它确实起到了作用,因此如果你碰巧知道答案,别忘了分享;)

4

18 回答 18

426

而不是形状,您可以尝试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" />

为一条水平线。

于 2010-04-17T16:08:41.597 回答
120

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

<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 中定义一个 30dp 的 layout_width。但在这种情况下,最终宽度也将是 30dp,这在大多数情况下可能是不可取的。这实质上意味着宽度和高度必须是相同的值,即您想要的线条长度的值。我不知道如何解决这个问题。

这似乎是“android 方式”解决方案,但除非我提到的尺寸问题有一些修复或解决方法,否则这可能不适用于大多数人。我们真正需要的是 <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" />
于 2010-09-22T20:56:44.630 回答
23

您可以使用旋转属性

 <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>
于 2015-03-17T06:00:57.630 回答
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 高度的视图背景

于 2012-09-08T12:43:31.840 回答
13

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

<?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>
于 2018-05-10T13:08:41.553 回答
12

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

<?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>
于 2013-06-27T15:13:57.723 回答
5

我需要动态/以编程方式添加我的视图,因此添加额外的视图会很麻烦。我的视图高度是 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 参数是drawLine(startX, startY, stopX, stopY, paint)这样您就可以在视图的任何方向上绘制任何直线。然后在我的活动中,我 NoteTextView note = new NoteTextView(this); 希望这会有所帮助。

于 2013-01-21T13:24:25.987 回答
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"/>
于 2013-12-23T15:54:37.540 回答
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 的细黑线,并将此可绘制对象作为背景。

于 2014-05-07T09:31:10.777 回答
2
<?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>
于 2018-07-20T15:46:34.377 回答
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>
于 2019-09-04T02:47:51.837 回答
2

尽管@CommonsWare 的解决方案有效,但它不能用于例如layer-list可绘制对象中。选项组合<rotate><shape>导致大小问题。这是使用 Android Vector Drawable 的解决方案。这个 Drawable 是一条 1x10dp 的白线(可以通过修改width,heightstrokeColor属性来调整):

<?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> 
于 2020-12-01T10:54:49.300 回答
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"/>

您可能必须根据破折号的大小来调整宽度,才能将其排成一行。

希望这有助于干杯

于 2013-11-06T10:23:55.663 回答
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>

    ..........
    .......
    ......
于 2014-05-15T13:00:56.967 回答
0

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

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

不要使用stroke, 使用solid(这是“填充”颜色)来指定线条的颜色。

于 2017-11-08T17:28:40.227 回答
0

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

根据我的观点,创建自定义视图是最好的解决方案。

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

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

于 2021-02-20T11:01:16.623 回答
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" />
于 2021-08-06T07:39:29.647 回答
-1
 <View
        android:layout_width="2dp"
        android:layout_height="40dp"

        android:background="#ffffff"
        android:padding="10dp" />`
于 2015-01-12T08:46:31.167 回答