使用XML绘制的垂直线

我试图找出如何定义一个垂直线(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变得复杂。

任何人有这个机会吗?

UPDATE

案件尚未解决。 但是,对于Android文档讨论中的任何人,您可能会发现这很有用: 缺lessAndroid XML手册

UPDATE

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

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

为一条水平线。

你可以将你的形状嵌套在一个旋转标签中。

 <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,那么你需要在layout xml中定义一个30dp的layout_width。 但是在这种情况下最终的宽度也将是30dp,这在大多数情况下可能是不可取的。 这基本上意味着宽度和高度都必须是相同的值,即所需长度的值。 我无法弄清楚如何解决这个问题。

这似乎是“android的方式”的解决scheme,但除非有一些解决方法或解决方法我提到的维度问题,那么这可能不适用于大多数人。 我们真正需要的是<shape />或<stroke />中的方向属性。

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

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

但是,我没有testing过这个,并期望它有相同的问题。

– 编辑 –

哦,其实我find了一个解决办法。 你可以在布局xml中使用负边距来消除不必要的额外空间。 如:

 <ImageView android:layout_width="35dp" android:layout_height="35dp" android:layout_marginLeft="-15dp" android:layout_marginRight="-15dp" android:src="@drawable/dashed_vertical_line" /> 
 <?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高度固定的大小

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

我想出了一个不同的解决scheme。 这个想法是首先用你喜欢的颜色填充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> 

我需要dynamic/以编程方式添加视图,因此添加额外的视图会非常麻烦。 我的视图高度是WRAP_CONTENT,所以我不能使用矩形解决scheme。 我在这里find了关于扩展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); 希望这可以帮助。

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

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

这个例子将在视图的右侧创build一个1dp的细黑线,将这个drawable作为背景。

你可以使用一个形状,而不是一条线使它成矩形。

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

您可能需要根据破折号的大小来玩宽度,才能将其放在一行中。

希望这有助于干杯

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

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

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

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

我用LinearLayout和View创build了一个RelativeLayout。 LinearLayout(我不知道它是否也可以是一个RelativeLayout)包含正常视图,视图是行。

代码如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true"> <-- Your views here --> </LinearLayout> <View android:layout_width="1dp" android:layout_height="fill_parent" android:background="#000000" android:layout_alignParentRight="true" /> </RelativeLayout> 
  <View android:layout_width="2dp" android:layout_height="40dp" android:background="#ffffff" android:padding="10dp" />` 

很简单,我认为更好的方法。

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