如何使用 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_parent
、weight
或 dp
.
中的固定值指定
然后将视图放在 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" />
下面是我使用下面的代码创建的绘图。但是我打算将它与布局文件多次使用。有谁知道最好的方法是什么来删除线性布局,同时保留此绘图的相同外观并将使用的视图数量保持在最低限度?
使用线性布局的主要好处是布局权重可用于 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_parent
、weight
或 dp
.
然后将视图放在 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" />