Как я могу изменить положение обзора с помощью кода? Как изменение его положения X, Y. Является ли это возможным?
Как я могу изменить положение обзора с помощью кода? Как изменение его положения X, Y. Является ли это возможным?
Ответы:
Для всего, что ниже Honeycomb (уровень API 11), вам придется использовать setLayoutParams(...)
.
Если вы можете ограничить поддержку Honeycomb и выше , вы можете использовать setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
и т.д.
Да, вы можете динамически устанавливать положение обзора в Android. Точно так же у вас есть ImageView
in 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);
Надеюсь, вам будет полезно установить позицию.
Уже есть разные допустимые ответы, но, похоже, ни один из них не предлагает должным образом, какой метод (ы) использовать в этом случае, за исключением соответствующих ограничений уровня 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()
работают вне системы макета, и соответствующие значения обрабатываются как дополнительное смещение к значениям влево / вверх / вниз / вправо, определяемым системой макета, соответственно смещая вид. Кажется, они были добавлены для анимации (где требуется немедленный эффект без прохождения цикла макета).
marginLeft
можно установить с помощью setLayoutParams
a, new FrameLayout.LayoutParams(width, height)
на котором вы установилиmarginLeft
Существует библиотека под названием NineOldAndroids , которая позволяет использовать библиотеку анимации Honeycomb вплоть до первой версии.
Это означает, что вы можете определить left, right, translationX / Y с немного другим интерфейсом.
Вот как это работает:
ViewHelper.setTranslationX(view, 50f);
Вы просто используете статические методы из класса ViewHelper, передаете представление и любое значение, которое вы хотите установить.
Я бы рекомендовал использовать setTranslationX
и setTranslationY
. Я только начинаю это делать, но это кажется наиболее безопасным и предпочтительным способом перемещения обзора. Я думаю, это во многом зависит от того, что именно вы пытаетесь сделать, но для меня это хорошо работает для 2D-анимации.
Вы можете попробовать использовать следующие методы, если используете HoneyComb Sdk (уровень API 11).
view.setX(float x);
Параметр x - это визуальная позиция x этого представления.
view.setY(float y);
Параметр y - это визуальная позиция y этого представления.
Надеюсь, это будет вам полезно. :)
Для поддержки всех уровней API вы можете использовать его так:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Установите левую позицию этого представления относительно его родителя:
view.setLeft(int leftPosition);
Установите правильное положение этого представления относительно его родителя:
view.setRight(int rightPosition);
Установите верхнее положение этого представления относительно его родителя:
view.setTop(int topPosition);
Установите нижнюю позицию этого представления относительно его родителя:
view.setBottom(int bottomPositon);
Вышеупомянутые методы используются для установки позиции представления относительно его родителя.
Используйте 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);
NB: обратите внимание, что вы также можете использовать imageView.setLeft (int dim), НО ЭТО НЕ УСТАНАВЛИВАЕТ положение компонента, он установит только положение левой границы компонента, остальные останутся в том же положении .
Я обнаружил, что @Stefan Haustein очень близок к моему опыту, но не уверен на 100%. Мое предложение:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
иногда не работает.setX()
setY()
вместо этого / . (Возможно, вы захотите поискать больше в различиях setLeft()
иsetX()
)При позиционировании следует помнить, что каждое представление имеет индекс относительно родительского представления. Итак, если у вас линейный макет с тремя вложенными представлениями, каждое из них будет иметь индекс: 0, 1, 2 в приведенном выше случае.
Это позволяет вам добавить представление в последнюю позицию (или конец) в родительском представлении, выполнив что-то вроде этого:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
В качестве альтернативы вы можете заменить представление, используя что-то вроде следующего:
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
- так что, может быть, это не такая уж хорошая идея;)