Как я могу динамически установить положение представления в Android?


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

11 80

11 ответов:

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

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

Да, вы можете динамически установить положение зрения в Android. Точно так же у вас есть ImageView in LinearLayout вашего xml file.So вы можете установить его положение через 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);

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

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

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

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

ViewHelper.setTranslationX(view, 50f);

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

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

  • если вы можете дождаться цикла компоновки и родительская группа представлений поддерживает MarginLayoutParams (или подкласс), set 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 view. Таким образом, установка MarginLayoutParams кажется, самый безопасный и чистый способ установить постоянное положение. Однако в некоторых случаях задержка асинхронного макета может быть проблемой, например, при использовании представления для визуализации курсора, и это предполагается, что он будет повторно позиционирован и служить в качестве якоря PopupMenu в то же время. В этом случае вызов layout() работал штрафа для меня.

проблемы с setLeft() и setTop() являются:

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

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

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

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

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

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

view.setX(float x);

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

view.setY(float y);

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

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

установите левое положение этого вида относительно его родителя:

view.setLeft(int leftPosition);

установите правильное положение этого представления относительно его родителя:

view.setRight(int rightPosition);

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

view.setTop(int topPosition);

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

view.setBottom(int bottomPositon);

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

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

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

NB: обратите внимание, что вы можете использовать также imageView.setLeft (int dim), но это не будет устанавливать положение компонента, он будет устанавливать только положение левой границы компонента, остальные останутся на прежнем уровне позиция.

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

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

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);

я обнаружил, что @Stefan Haustein очень близок к моему опыту, но не уверен на 100%. Мое предложение:

  • setLeft()/setRight()/setBottom()/setTop() не работает иногда.
  • если вы хотите установите положение временно (например, для выполнения анимации, не влияет на иерархию), когда вид был добавлен и отображается, просто использовать setX()/setY() вместо. (Вы можете искать больше в разница setLeft() и setX())
  • и обратите внимание, что X, Y кажутся абсолютными, и это было поддержано AbsoluteLayout, который теперь устарел. Таким образом, вы чувствуете, что X, Y, вероятно, больше не поддерживается. И да, это так, но только частично. Это значит, если ваш вид добавлен, setX (), setY () будет работать отлично; в противном случае,, когда попытаться добавить представление в макет группы просмотра (например FrameLayout, LinearLayout, RelativeLayout), вы должны набор его LayoutParams с marginLeft, marginTop вместо (setX (), setY () в этом случае не будет работать иногда).
  • установите положение представления по marginLeft и marginTop это несинхронизированные