我正在尝试构建一个自定义视图,但似乎有些东西我没有得到。
我已经覆盖了onSizeChanged和onDraw方法,并在活动布局中添加了我的自定义视图,并为其指定了100dp的高度,并将其固定到底部以及父相对布局的开始和结束。 但是,视图无法正确呈现,并且其下方有一个空白空白区域。
下面的是我的onDraw和onSizedChanged方法
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
viewHeight = h;
viewWidth = w;
}
@Override
protected void onDraw(Canvas canvas) {
// draw background
painter.setStrokeWidth(viewHeight);
painter.setColor(Color.BLUE);
canvas.drawLine(0, 0, viewWidth, 0, painter);
}
下面是我如何将视图添加到布局xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_registration"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.example.activities.RegistrationActivity">
<com.example.custom.widgets.MyCustomView
android:id="@+id/holder"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="100dp"/>
<FrameLayout
android:layout_above="@+id/holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="kjdgfjkasdgfjkahsdgfjkhsa"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</RelativeLayout>
FWIW,我还尝试在FrameLayout中嵌入我的自定义视图,并明确设置FrameLayout的高度,并将自定义视图的高度设置为match_parent。仍然没有成功。
答案 0 :(得分:0)
在自定义视图类中覆盖onMeasure()将根据父级提供的布局约束设置视图的大小。
这应该为您的自定义视图提供100dp的高度:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = Math.min(100, MeasureSpec.getSize(heightMeasureSpec));
setMeasuredDimension(width, height);
}
如果更改父级的约束,则需要更改传递给方法的MeasureSpec值。请参阅此问题:https://stackoverflow.com/a/12267248/7395923
将onDraw()方法更改为:
protected void onDraw(Canvas canvas) {
// draw background
painter.setStrokeWidth(getWidth());
painter.setColor(Color.BLUE);
canvas.drawLine(0, 0, getWidth(), 0, painter);
}
删除onSizeChanged()方法。