Android自定义视图高度不正确

时间:2017-02-18 09:37:11

标签: java android android-custom-view

我正在尝试构建一个自定义视图,但似乎有些东西我没有得到。

我已经覆盖了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>

它的外观enter image description here

FWIW,我还尝试在FrameLayout中嵌入我的自定义视图,并明确设置FrameLayout的高度,并将自定义视图的高度设置为match_parent。仍然没有成功。

1 个答案:

答案 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()方法。