使用XML drawable的垂直线

Kas*_*spa 146 android line android-layout 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>
Run Code Online (Sandbox Code Playgroud)

问题是,如何使这条线垂直?

是的,有一些解决方法,例如绘制1px厚的矩形形状,但如果它由多个<item>元素组成,则会使可绘制XML变得复杂.

有没有机会这个?

UPDATE

案件仍未解决.但是,对于Android文档运动中的任何人 - 您可能会发现这很有用: 缺少Android XML手册

UPDATE

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

Com*_*are 371

而不是形状,你可以尝试View:

<View
    android:layout_width="1dp"
    android:layout_height="fill_parent"
    android:background="#FF0000FF" />
Run Code Online (Sandbox Code Playgroud)

我只将它用于水平线,但我认为它也适用于垂直线.

使用:

<View
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:background="#FF0000FF" />
Run Code Online (Sandbox Code Playgroud)

对于水平线.

  • 谢谢马克:)!我知道我可以使用视图来实现这一目标.问题是我正在组装一个更复杂的视图,我想用它作为表格单元格背景的drawable.那里有不同类型的形状/渐变/线条.使用视图将是一个解决方案,但是我必须把它放在一个不同的绘图"层"中,当我遇到调整大小等时,这可能会让你自己陷入困境.我想知道为什么没有关于"形状"xmls,也许来自谷歌的人可以启发我们?:) (4认同)

小智 101

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

<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>
Run Code Online (Sandbox Code Playgroud)

但是,唯一的问题是布局中定义的布局参数xml将是用于绘制原始形状的尺寸.这意味着如果您希望您的行高30dp,则需要在布局xml中定义layout_width为30dp.但在这种情况下,最终宽度也将是30dp,这在大多数情况下可能是不合需要的.这实际上意味着宽度和高度必须是相同的值,即线所需长度的值.我无法弄清楚如何解决这个问题.

这似乎是"android方式"解决方案,但除非我提到维度问题的某些修复或解决方法,否则这可能对大多数人不起作用.我们真正需要的是<shape />或<stroke />中的orientation属性.

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

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90"
    android:drawable="@drawable/horizontal_line" />
Run Code Online (Sandbox Code Playgroud)

但是我没有对此进行测试,并期望它有同样的问题.

- 编辑 -

哦,我实际上想出了一个修复.您可以在布局xml中使用负边距来消除不需要的额外空间.如:

<ImageView
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_marginLeft="-15dp"
    android:layout_marginRight="-15dp"
    android:src="@drawable/dashed_vertical_line" />
Run Code Online (Sandbox Code Playgroud)

  • 虽然负余量适用于99%的设备....只要知道,如果你这样做,那里会有强制关闭的设备.某些设备在填充负边距时遇到问题 (4认同)
  • @cephus 我使用你的第一个代码,但我需要视图顶部的行。它在我的视野中。如何为其设置重力(在形状 xml 文件中)? (2认同)

log*_*cat 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>
Run Code Online (Sandbox Code Playgroud)

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


小智 15

您可以使用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>
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是一个更好(或最好)的答案,因为@ commonsware的答案足以满足正常的垂直线.如果我们不想创建虚线(例如),这是唯一可以正常工作的答案. (6认同)

Eri*_*Kok 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>
Run Code Online (Sandbox Code Playgroud)


a.c*_*ch. 6

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

<?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>
Run Code Online (Sandbox Code Playgroud)


wil*_*lma 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要在左侧有一条垂直线,但drawLine(startX, startY, stopX, stopY, paint)绘制线参数是这样您可以在视图的任何方向上绘制任何直线。然后在我的活动中,我NoteTextView note = new NoteTextView(this); 希望这会有所 帮助。


小智 5

非常简单...在 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"/>
Run Code Online (Sandbox Code Playgroud)