Android: размещение вида в произвольном месте - PullRequest
3 голосов
/ 22 июня 2010

Я пытался разместить вид в произвольном месте.

Моя цель: Наложить некоторый прямоугольник JPG / PNG с заданными координатами , которые относятся кJPG / PNG , с каким-то другим видом, скажем, Галерея или какое-то видео.

Я не хочу использовать AbsoluteLayout, так как он ограничен.

Поэтому яиспользуя RelativeLayout, определяя фиктивное текстовое поле в качестве заполнителя, и помещая мое представление RIGHT_TO и НИЖЕ текстовое поле.

+--------+
|TextView|
|        | (x,y)
+--------+-----------------------+
         |                       |
         |     My View           |
         |                       |
         +-----------------------+

Мой вопрос: Есть ли более надежный и элегантный способ сделатьчто?

Проблема с предложенным выше способом в том, что он очень хрупкий: координаты нужно пересчитывать для каждого нового экрана.Мой взгляд перекрывает что-то ниже.Он должен быть точно размещен, что довольно сложно сделать.

  • Мне нужно будет снова разметить экран при повороте, увеличении или как угодно. Хуже:
    • Во время инициализации, типичное время размещения изображений, координаты экрана недопустимы.Координаты действительны после размещения объектов на экране.Для точного размещения объектов на экране нам нужны координаты.Проблема с курицей и яйцом: (
    • При вращении координаты включают поля, а не ширину самого вида (пример: на AVD с портретом, отобразите ImageView с портретом, затем нажмите CTRL + F12, чтобы повернуть.Слева, справа, сверху и снизу ImageView совсем не так, как ожидалось).
    • При масштабировании с анимацией координаты масштабируются.

Так что я быхотел бы найти лучший способ сделать это.

Thanks
    M.

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Решение довольно уродливое, оно не относительное, но некоторые могут сказать, что оно правдоподобно:

Добавление FrameLayout в качестве контейнера (а не RelativeLayout, как указано ниже).Отображаемое представление является дочерним для этого FrameLayout.Чтобы разместить его на месте, добавьте отступы.

void addViewInAnArbitraryRect( Rect rect, 
                               Context context, 
                               View subjectView, 
                               View parent ) {
    FrameLayout container = new FrameLayout( context );
    parent.addView( container );
    container.setPadding( rect.left,
                          rect.top,
                          container.getWidth() - rect.right,
                          container.getHeight() - rect.bottom );
    container.addView( subjectView );

}

Примечание: Возможно, вы захотите настроить координаты страницы в соответствии с координатами на экране.Просто помните:

  1. Координаты / ширина / высота не готовы до вызова onSizeChanged.
  2. Не манипулируйте представлениями из области действия onSizeChanged, иначе это может привести к обрезке вашего представления.Представления должны управляться из контекста потока, который их создал.Для этого используйте Handler.

Я надеялся, что это кому-нибудь помогло.

Мейман

2 голосов
/ 30 июня 2010

Не совсем понимая, что вы делаете, кажется, что вы делаете дополнительную работу для себя, используя RelativeLayout.То, что вы пытаетесь разместить на экране, не относится ни к чему, оно основано на определенной координате на изображении, поэтому даже если вы используете один из других макетов, вы все равно по существу размещаете что-то в абсолютных координатах.

Что касается AbsoluteLayout, который устарел, то, что я прочитал, это просто препятствует его использованию из-за его недостатков, связанных с переменным размером экрана.У них нет намерения фактически удалить его, и даже если бы они это сделали, вы могли бы просто получить исходный код и скомпилировать его в свой проект.

...