如何使用 XML 布局以外的方式绘制自定义视图装饰?

How to draw custom view decorations other way than with XML layouts?

下面是我使用下面的代码创建的绘图。但是我打算将它与布局文件多次使用。有谁知道最好的方法是什么来删除线性布局,同时保留此绘图的相同外观并将使用的视图数量保持在最低限度?

使用线性布局的主要好处是布局权重可用于 space 矩形均匀分布,但不幸的是,当线性布局被删除并且必须对相对布局做出答复时,如果不使用 dp 测量单位,似乎不可能有相等的间距(这不是我想要的,特别是考虑到 Android 屏幕有各种不同的尺寸)。

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#808080" >
        <include
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_gravity="center"
            layout="@layout/textview_carriage2"/>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="10dp"
            android:layout_alignParentTop="true"
            android:orientation="horizontal"
            android:weightSum="100"
            android:baselineAligned="false" >

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>

            <include
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:layout_weight="7"
                layout="@layout/view_spacebetweenwindows"/>

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>

            <include
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:layout_weight="6"
                layout="@layout/view_spacebetweenwindows"/>

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>

            <include
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:layout_weight="7"
                layout="@layout/view_spacebetweenwindows"/>

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="10dp"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal"
            android:weightSum="100"
            android:baselineAligned="false" >

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>

            <include
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:layout_weight="7"
                layout="@layout/view_spacebetweenwindows"/>

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>

            <include
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:layout_weight="6"
                layout="@layout/view_spacebetweenwindows"/>

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>

            <include
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:layout_weight="7"
                layout="@layout/view_spacebetweenwindows"/>

            <include
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                layout="@layout/view_emptyrect_red"/>
        </LinearLayout>
    </RelativeLayout>

使用 XML 布局对于像这样的简单装饰来说是矫枉过正的解决方案。而是扩展 TextView(或其他 View,如果您愿意)并覆盖 onDraw() 方法。

创建字段 paint 并在您从所有构造函数调用的 init() 方法中初始化它:

Paint paint;

private void init() {
    paint = new Paint();
    paint.setColor(Color.RED);
    paint.setStrokeWidth(4); // convert to dp?
    paint.setStyle(Paint.Style.STROKE); // delete line for filled rect
}

onDraw() 方法应如下所示:(自定义!)

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int w = canvas.getWidth();
    int h = canvas.getHeight();

    int rectWidth = w/5;
    int space = w/15;
    int topRectHeight = getPaddingTop();
    int bottomRectHeight = getPaddingBottom();

    for (int i = 0; i < 4; i++) {
        int left = i * (rectWidth + space);
        int right = left + rectWidth;

        Rect rect = new Rect(left, 0, right, topRectHeight);
        canvas.drawRect(rect, paint);

        Rect rect2 = new Rect(left, h - bottomRectHeight, right, h);
        canvas.drawRect(rect2, paint);
    }
}

这将在填充区域绘制矩形。请注意,宽度应由 match_parentweightdp.

中的固定值指定

然后将视图放在 XML

<your.package.RectangleTextView 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:text="2"
    android:gravity="center" />