Область рисования пользовательского представления охватывает другие поля - PullRequest
0 голосов
/ 30 марта 2011

У меня есть пользовательский вид, который представляет собой вертикальный индикатор выполнения. Это просто пользовательский вид, рисующий на холсте, чтобы заполнить снизу вверх процентом завершения. В моем 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_ над нижним текстом), как с match_parent, так и с wrap_content, но безрезультатно. Я попытался перейти на линейный макет, но без лучшего результата.

В случае, показанном в коде, отображается верхний текст, но нижний текст пропал. Когда я изменил порядок так, чтобы пользовательский вид был layout_ над нижним текстом, он просто переместил область рисования вверх, чтобы нижний текст был виден, но покрыл верхний текст. Обратите внимание, что когда я говорю, что нижний текст пропал, я имею в виду пропал, а не просто скрыт Мой последний тест состоял в том, чтобы жестко закодировать layout_height в «350dp» в макете.

Во всех случаях я всегда получаю высоту 489 на этом конкретном устройстве, даже с жестко заданной высотой. Я не могу понять, что мне нужно сделать, чтобы получить среднюю часть экрана, как что-то, на чем я могу рисовать, а остальное оставить в покое. Предполагается, что пользовательские представления являются последним элементом макета? Единственный способ заставить это работать - изменить порядок так, чтобы пользовательский вид был последним в макете, чтобы нижняя часть пользовательской области находилась поверх нижнего текста, нижний текст все еще отображался, а затем добавлялся вручную. около 150 до верха (т.е. не пишите в ноль на холсте, предоставленном onDraw ()), чтобы он не покрывал верхний текст. К счастью, рисунок, который я рисую, полупрозрачен, поэтому я могу видеть, покрыт ли текст или нет.

Кто-нибудь имеет больше информации о том, как это должно работать? Удалось ли мне объяснить, что я сделал более запутанным, чем реальная проблема?

Спасибо, гб

1 Ответ

0 голосов
/ 30 марта 2011

Кто-то предложил в автономном режиме вместо того, чтобы просто поместить настраиваемое поле «выше» или «ниже» одного из других полей, сделать оба.Сохраните его как последний элемент в XML и установите android:layout_above и android:layout_below.Я сделал это, и теперь мои вершины верны правильно.

...