Android 使用XML可绘制的垂直线

Android 使用XML可绘制的垂直线,android,android-layout,line,android-xml,android-drawable,Android,Android Layout,Line,Android Xml,Android Drawable,我正试图弄清楚如何定义一条垂直线(1dp厚)作为可绘制线 <?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" androi

我正试图弄清楚如何定义一条垂直线(1dp厚)作为可绘制线

<?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>
要制作一个水平的,它非常简单:

<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由多个
元素组成,则会使其复杂化

有人有过这样的机会吗

更新

这个案子还没有解决。然而, 对于任何参与Android文档改革的人,您可能会发现以下内容非常有用:

更新


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

您可以尝试查看
视图,而不是形状:

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

我只对水平线使用过这个,但我认为它也适用于垂直线

使用:



用于水平线。

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

<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的布局宽度。但在这种情况下,最终宽度也将为30dp,这在大多数情况下可能是不可取的。这本质上意味着宽度和高度必须是相同的值,即线条所需长度的值。我想不出怎么解决这个问题

这似乎是“安卓方式”的解决方案,但除非我提到的维度问题有一些修复或解决方法,否则这可能对大多数人都不起作用。我们真正需要的是or中的方向属性

也可以尝试在旋转标记的属性中引用另一个可绘制图形,例如:

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

然而,我还没有测试过它,我希望它也会有同样的问题

--编辑--

哦,我真的找到了解决办法。您可以在布局xml中使用负边距来消除不需要的额外空间。 例如:




工作是我的。用fill_parent或dp height中的固定大小将其作为视图的背景,我需要以动态/编程方式添加视图,因此添加额外视图会很麻烦。我的视图高度是包裹内容,因此无法使用矩形解决方案。我发现了一篇关于扩展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=新的NoteTextView(此)

希望这有帮助

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

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

您可以使用形状,但不要使用直线,而是使用矩形

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

在你的布局中使用这个

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

根据破折号的大小,您可能需要调整宽度,才能使其成为一行

希望这有帮助 干杯

这很简单。。。 要在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"/>

取决于您想要垂直线的位置,但是如果您想要垂直边框,您可以让父视图具有自定义可绘制的背景。然后您可以像这样定义可绘制的:

<?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细黑线,该线将作为背景绘制。

将其添加到styles.xml中
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>

    ..........
    .......
    ......
1dip 匹配父项 @颜色/分隔器颜色 1dip 匹配父项 然后将这个样式包装成一个线性布局,在这里你需要垂直线,我在我的表中使用垂直线作为列分隔符。 //................................................................... //................................................................... //............................................................... //................................................................... .......... ....... ......
`

您可以使用“旋转”属性

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

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

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


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

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

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


似乎没有人提到这个选项:


尽管@commonware的解决方案有效,但它不能
 <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>
<shape>
    <size
        android:width="1dp"
        android:height="16dp" />
    <solid
        android:color="#c8cdd2" />
</shape>
<?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>
<?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>
<?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>