Android 使用XML可绘制的垂直线
我正试图弄清楚如何定义一条垂直线(1dp厚)作为可绘制线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
<?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>