自定义视图的可绘制区域涵盖其他字段

时间:2011-03-29 22:00:53

标签: android view ondraw

我有一个自定义视图,它是一种垂直进度条。它只是一个自定义视图,绘制在画布上,从底部到顶部填充百分比完成。在我的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_height硬编码为“350dp”。

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

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

谢谢, GB

1 个答案:

答案 0 :(得分:0)

有人建议离线,而不是只将自定义字段放在其他字段的“上方”或“下方”,同时执行这两项操作。将其保留为XML中的最后一项,并设置android:layout_aboveandroid:layout_below。我做到了,现在我的高度正确。