在android中创build水平和垂直的虚线

我想在android中使用形状绘制水平和垂直的虚线。

我想画这样

在这里输入图像说明

对于水平线

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line" > <stroke android:dashGap="6px" android:dashWidth="6px" android:color="#C7B299" /> </shape> 

对于垂直线

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line" > <size android:height="400dp"/> <stroke android:dashGap="6px" android:dashWidth="6px" android:color="#C7B299" /> </shape> 

但不显示我的输出垂直虚线显示这样

在这里输入图像说明

如何绘制垂直线。

Solutions Collecting From Web of "在android中创build水平和垂直的虚线"

我find了解决scheme

 <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="90" android:toDegrees="90" > <shape android:shape="line" > <stroke android:dashGap="6px" android:dashWidth="6px" android:color="#C7B299" /> </shape> </rotate> 

要么

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

我想我已经find了一个“更清洁”的解决scheme,通过创build一个包含特定代码的自定义视图来绘制虚线(垂直和水平方向)以及一系列属性,使它非常容易使用XML布局。 这种方法比“旋转线”方法的主要优点是可以像平时一样设置虚线视图的大小,而不必担心旋转后视图的行为(一旦旋转适用于整个虚线视图,而不仅仅是绘制的线)。

所以这里是一步一步的解决scheme:

  1. 使用以下内容创build文件“/res/values/attrs.xml”:

     <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="DividerView"> <attr name="color" format="color" /> <attr name="dashLength" format="dimension" /> <attr name="dashGap" format="dimension" /> <attr name="dashThickness" format="dimension" /> <attr name="orientation" format="enum"> <enum name="horizontal" value="0" /> <enum name="vertical" value="1" /> </attr> </declare-styleable> </resources> 

这将创build用于控制自定义视图的属性。 注意:如果上述文件已经存在于您的项目中,只需在现有的“resources”块中复制/粘贴“declare-stylable”块即可。

  1. 创buildDividerView类并粘贴下面的内容:

     public class DividerView extends View { static public int ORIENTATION_HORIZONTAL = 0; static public int ORIENTATION_VERTICAL = 1; private Paint mPaint; private int orientation; public DividerView(Context context, AttributeSet attrs) { super(context, attrs); int dashGap, dashLength, dashThickness; int color; TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DividerView, 0, 0); try { dashGap = a.getDimensionPixelSize(R.styleable.DividerView_dashGap, 5); dashLength = a.getDimensionPixelSize(R.styleable.DividerView_dashLength, 5); dashThickness = a.getDimensionPixelSize(R.styleable.DividerView_dashThickness, 3); color = a.getColor(R.styleable.DividerView_color, 0xff000000); orientation = a.getInt(R.styleable.DividerView_orientation, ORIENTATION_HORIZONTAL); } finally { a.recycle(); } mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(color); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(dashThickness); mPaint.setPathEffect(new DashPathEffect(new float[] { dashLength, dashGap, }, 0)); } public DividerView(Context context) { this(context, null); } @Override protected void onDraw(Canvas canvas) { if (orientation == ORIENTATION_HORIZONTAL) { float center = getHeight() * .5f; canvas.drawLine(0, center, getWidth(), center, mPaint); } else { float center = getWidth() * .5f; canvas.drawLine(center, 0, center, getHeight(), mPaint); } } } 
  2. 为了在布局文件中使用自动填写属性,请在最上面的容器中添加以下名称空间定义:

     xmlns:custom="http://schemas.android.com/apk/res/com.example" 

用你的包名称replacecom.example 。 您还可以通过更适合您的需求的任何前缀更改custom 。 注意:您可能需要重新启动Eclipse才能在attrs.xml文件发生更改后自动完成工作。

  1. 最后通过在布局中插入以下元素来创build虚线,就像其他任何视图一样:

     <com.example.DividerView android:layout_width="1dp" android:layout_height="fill_parent" android:layerType="software" custom:color="@color/grey" custom:orientation="vertical" custom:dashLength="1dp" custom:dashGap="1dp" custom:dashThickness="1dp" /> 

我希望它有帮助!

如果视图有1dp的宽度,那么只是旋转你的水平线是不够的。 垂直线的长度将为1dp,因为它是先水平绘制,然后旋转。 这是解决这个问题的一个技巧:

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:left="-300dp" android:right="-300dp"> <rotate android:drawable="@drawable/dash_line_divider_horizontal" android:fromDegrees="90" android:toDegrees="90"/> </item> </layer-list> 

这适用于我:

vertical_line.xml

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@android:color/transparent"/> <stroke android:width="1px" android:color="#60000000" android:dashGap="5px" android:dashWidth="5px" /> </shape> 

在布局中:

 <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:background="@drawable/vertical_line" />