Java Android自定义视图高度不正确

Java Android自定义视图高度不正确,java,android,android-custom-view,Java,Android,Android Custom View,我试图建立一个自定义视图,但似乎有些东西我没有得到 我已经重写了onSizeChanged和onDraw方法,并在活动布局中添加了我的自定义视图,并将其高度设置为100dp,并将其固定到父相对布局的底部以及开始和结束处。 但是,视图无法正确渲染,并且视图下方有一个空白 下面是我的onDraw和onSizedChanged方法 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {

我试图建立一个自定义视图,但似乎有些东西我没有得到

我已经重写了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的高度,并将自定义视图的高度设置为与父视图匹配。仍然没有成功。

在自定义视图类中重写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值。见这个问题:

将onDraw()方法更改为:

protected void onDraw(Canvas canvas) {
    // draw background
    painter.setStrokeWidth(getWidth());
    painter.setColor(Color.BLUE);
    canvas.drawLine(0, 0, getWidth(), 0, painter);
}

然后删除onSizeChanged()方法。

不过,您试图解决的问题对我来说还是个谜。是否希望自定义视图仅为100dp高度蓝线?@azizbekian我希望自定义视图的高度与layout_height属性中指定的高度相同,在本例中,该属性为100dp
painter.setStrokeWidth(viewHeight)此行后面的逻辑正确吗?您正在尝试将笔划宽度设置为100dp吗?@azizbekian painter.setStrokeWidth(viewHeight);根据我的理解,应该画一条100dp的线,或者是像素级的线<代码>画布.绘制线(0,0,viewWidth,0,Paint)将实际划出界限<代码>画师设置行程宽度(视图高度)指定您想要的线的厚度。把它设为10,看看有什么不同。