Как я могу динамически установить положение просмотра в Android? - PullRequest
91 голосов
/ 30 июня 2011

Как я могу изменить позицию просмотра с помощью кода?Как изменение своей позиции X, Y.Возможно ли это?

Ответы [ 11 ]

111 голосов
/ 30 июня 2012

Для всего, что ниже Сота (API уровня 11), вам нужно будет использовать setLayoutParams(...).

Если вы можете ограничить вашу поддержку Honeycomb и выше, вы можете использовать setX(...), setY(...), setLeft(...), setTop(...) и т. Д.

42 голосов
/ 24 мая 2012

Да, вы можете динамически устанавливать положение просмотра в Android.Точно так же у вас есть ImageView в LinearLayout вашего XML-файла. Таким образом, вы можете установить его положение с помощью LayoutParams. Но убедитесь, что вы взяли LayoutParams в соответствии с макетом, взятым в вашем XML-файле. Существуют другие LayoutParams в соответствии с выбранным макетом.

Вот код для установки:

    LayoutParams layoutParams=new LayoutParams(int width, int height);
    layoutParams.setMargins(int left, int top, int right, int bottom);
    imageView.setLayoutParams(layoutParams);

Я надеюсь, вам будет полезно установить позицию.

25 голосов
/ 16 января 2017

Уже есть разные действительные ответы, но, похоже, ни один из них не дает правильного представления о том, какой метод (ы) использовать в каком случае, за исключением соответствующих ограничений уровня API:

  • Если вы можетедождитесь цикла компоновки, и родительская группа представлений поддерживает MarginLayoutParams (или подкласс), установите marginLeft / marginTop соответственно.

  • Если вам нужно немедленно изменить позициюи постоянно (например, для привязки PopupMenu), дополнительно вызовите layout(l, t, r, b) с теми же координатами.Это опережает то, что система макета подтвердит позже.

  • Для немедленных (временных) изменений (например, анимации) используйте setX() / setY().В случаях, когда размер родительского элемента не зависит от WRAP_CHILDREN, может быть целесообразно использовать исключительно setX() / setY().

  • Никогда использовать setLeft() / setRight() / setBottom() / setTop(), см. Ниже.

Фон : mLeft / mTop / mBottom /mRight поля заполняются из соответствующих LayoutParams в layout ().Макет вызывается неявно и асинхронно системой макетов представления Android.Таким образом, установка MarginLayoutParams представляется наиболее безопасным и чистым способом постоянной установки позиции.Однако асинхронная задержка компоновки может быть проблемой в некоторых случаях, например, при использовании View для визуализации курсора, и он должен быть перемещен и одновременно служить якорем PopupMenu.В этом случае вызов layout() работал нормально для меня.

Проблемы с setLeft() и setTop():

  • Недостаточно одного их вызова - вам также нужно позвонить setRight() и setBottom()чтобы избежать растяжения или сжатия представления.

  • Реализация этих методов выглядит относительно сложной (= выполнение некоторой работы для учета изменений размера представления, вызванных каждым из них)

  • Кажется, они вызывают странные проблемы с полями ввода: Мягкая цифровая клавиатура EditText иногда не позволяет вводить цифры

setX() и setY() работают вне системы макетов, и соответствующие значения обрабатываются как дополнительное смещение к левому / верхнему / нижнему / правому значению, определенному системой макетов, соответственно смещая вид.Похоже, они были добавлены для анимации (где требуется немедленный эффект без прохождения цикла макета).

18 голосов
/ 25 июля 2013

Существует библиотека под названием NineOldAndroids , которая позволяет использовать библиотеку анимации Honeycomb вплоть до первой версии.

Это означает, что вы можете определить left, right, translationX / Y с немного другим интерфейсом.

Вот как это работает:

ViewHelper.setTranslationX(view, 50f);

Вы просто используете статические методы из класса ViewHelper, передаете представление и любое значение, которое хотите установить.

15 голосов
/ 03 сентября 2012

Я бы рекомендовал использовать setTranslationX и setTranslationY. Я только начинаю сам, но это, кажется, самый безопасный и предпочтительный способ перемещения представления. Я думаю, это во многом зависит от того, что именно вы пытаетесь сделать, но для меня это хорошо работает для 2D анимации.

12 голосов
/ 30 июня 2011

Вы можете попробовать использовать следующие методы, если вы используете HoneyComb Sdk (API Уровень 11).

view.setX(float x);

Параметр x - это визуальная позиция x этого вида.

view.setY(float y);

Параметр y - это визуальная позиция y этого вида.

Я надеюсь, что это будет полезно для вас. :)

6 голосов
/ 26 января 2015

Для поддержки всех уровней API вы можете использовать it , например:

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
4 голосов
/ 08 апреля 2014

Используйте LayoutParams. Если вы используете LinearLayout, вам нужно импортировать android.widget.LinearLayout.LayoutParams, иначе импортировать правильную версию LayoutParams для используемого вами макета, иначе это вызовет ClassCastException , затем:

LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);

Примечание: обратите внимание, что вы также можете использовать imageView.setLeft (int dim), НО ЭТО НЕ БУДЕТ устанавливать позицию компонента, он будет устанавливать только позицию левой границы компонента, остальные останется в той же позиции.

4 голосов
/ 30 июня 2011

Установить левую позицию этого представления относительно его родителя:

view.setLeft(int leftPosition);

Установите правильную позицию этого представления относительно его родителя:

view.setRight(int rightPosition);

Установить верхнюю позицию этого представления относительно его родителя:

view.setTop(int topPosition);

Установить нижнюю позицию этого вида относительно его родителя:

view.setBottom(int bottomPositon);

Указанные выше методы используются для установки позиции представления, связанной с его родителем.

3 голосов
/ 12 ноября 2011

Используйте RelativeLayout, поместите в него свой вид, получите RelativeLayout.LayoutParams объект из своего вида и установите поля, как вам нужно.Затем позвоните requestLayout() на ваш взгляд.Это единственный способ, которым я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...