0

我有一个类似于垂直进度条的自定义视图。它只是一个自定义视图,在画布上绘制以从下到上填充完成百分比。在我的 xml 中,我在自定义控件上方有文本,在自定义控件下方有文本(其中有两个,一个在左边,一个在右边,这是右边):

    <RelativeLayout android:layout_width="150dp"
        android:layout_height="fill_parent" android:layout_alignParentRight="true">
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/bar_right_text" android:text="Right"
android:layout_alignParentTop="true" android:gravity="center_horizontal" />
        <com.myApp.VBarView android:id="@+id/right_bar"
            android:layout_width="match_parent"
                    android:layout_height="match_parent"
                        android:layout_below="@id/bar_right_text"/>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/bar_right_time_text" android:text="Time Remaining" android:layout_below="@id/right_bar" android:gravity="center_horizontal" />
    </RelativeLayout>

在我的自定义视图中,我以我能想到的各种方式检查高度,但我总是得到一个一直到屏幕底部的高度

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    // h here is 489
}

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int myHt = getHeight();
    int myMeasHt = getMeasuredHeight();
    Rect canvasRct = canvas.getClipBounds();
    // all of these (myHt, myMeasHt, and canvasRct.getHeight()) are all 489
}

到目前为止,我已经尝试反转布局中的视图,因此顶部文本是第一个(顶部对齐),底部文本是第二个(底部对齐),自定义控件是最后一个(layout_above 底部文本),两者都有 match_parent和wrap_content,无济于事。我尝试更改为线性布局,但仍然没有更好的结果。

在代码中显示的情况下,显示了顶部文本,但底部文本消失了。当我更改顺序以使自定义视图位于底部文本之上的 layout_a 时,它只是将绘图区域向上移动,因此底部文本可见,但覆盖了顶部文本。请注意,当我说底部的文字不见了时,我的意思是不见了,而不仅仅是被掩盖了。我的最终测试是在布局中将 layout_height 硬编码为“350dp”。

在所有情况下,我在这个特定设备上总是得到 489 的高度,即使高度是硬编码的。我无法弄清楚我需要做什么才能将屏幕的中间部分作为我可以绘制的东西而不要管其余部分。是否假定自定义视图是布局中的最后一件事?我可以让它工作的唯一方法是更改​​顺序,使自定义视图位于布局中的最后一个,以便自定义区域的底部位于底部文本的顶部,仍然显示底部文本,然后手动添加大约 150 到顶部(即不要在提供给 onDraw() 的画布上写入零),因此它不会覆盖顶部文本。幸运的是,我正在绘制的图形是半透明的,所以我可以看到文本是被覆盖还是刚刚消失。

有没有人有更多关于这应该如何工作的信息?我是否设法解释我所做的事情比实际问题更令人困惑?

谢谢,gb

4

1 回答 1

0

有人建议离线,而不是将自定义字段放置在其他字段之一的“上方”或“下方”,两者都做。将其保留为 XML 中的最后一项,并设置android:layout_aboveandroid:layout_below. 我做到了,现在我的身高是正确的。

于 2011-03-30T13:52:33.557 回答