Как я могу изменить положение обзора с помощью кода? Как изменение его положения X, Y. Является ли это возможным?
102
Для всего, что ниже Honeycomb (уровень API 11), вам придется использовать setLayoutParams(...)
.
Если вы можете ограничить поддержку Honeycomb и выше , вы можете использовать setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
и т.д.
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.
- так что, может быть, это не такая уж хорошая идея;)Да, вы можете динамически устанавливать положение обзора в Android. Точно так же у вас есть
ImageView
inLinearLayout
вашего xml файла. Таким образом, вы можете установить его положение с помощью.LayoutParams
Но убедитесь, что вы выбрали вLayoutParams
соответствии с макетом, взятым в вашем XML-файле. Существуют разные в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
иsetTranslationY
. Я только начинаю это делать, но это кажется наиболее безопасным и предпочтительным способом перемещения обзора. Я думаю, это во многом зависит от того, что именно вы пытаетесь сделать, но для меня это хорошо работает для 2D-анимации.источник
Вы можете попробовать использовать следующие методы, если используете HoneyComb Sdk (уровень API 11).
Параметр x - это визуальная позиция x этого представления.
Параметр y - это визуальная позиция y этого представления.
Надеюсь, это будет вам полезно. :)
источник
Для поддержки всех уровней API вы можете использовать его так:
источник
Установите левую позицию этого представления относительно его родителя:
Установите правильное положение этого представления относительно его родителя:
Установите верхнее положение этого представления относительно его родителя:
Установите нижнюю позицию этого представления относительно его родителя:
Вышеупомянутые методы используются для установки позиции представления относительно его родителя.
источник
Используйте LayoutParams. Если вы используете LinearLayout, вам необходимо импортировать android.widget.LinearLayout.LayoutParams, иначе импортируйте правильную версию LayoutParams для используемого макета, или это вызовет ClassCastException , а затем:
NB: обратите внимание, что вы также можете использовать imageView.setLeft (int dim), НО ЭТО НЕ УСТАНАВЛИВАЕТ положение компонента, он установит только положение левой границы компонента, остальные останутся в том же положении .
источник
Используйте
RelativeLayout
, поместите в него свой вид, получитеRelativeLayout.LayoutParams
объект из своего вида и установите поля по мере необходимости. Тогда обращайтесьrequestLayout()
к вашему мнению. Это единственный способ, который я знаю.источник
Я обнаружил, что @Stefan Haustein очень близок к моему опыту, но не уверен на 100%. Мое предложение:
setLeft()
/setRight()
/setBottom()
/setTop()
иногда не работает.setX()
setY()
вместо этого / . (Возможно, вы захотите поискать больше в различияхsetLeft()
иsetX()
)источник
При позиционировании следует помнить, что каждое представление имеет индекс относительно родительского представления. Итак, если у вас линейный макет с тремя вложенными представлениями, каждое из них будет иметь индекс: 0, 1, 2 в приведенном выше случае.
Это позволяет вам добавить представление в последнюю позицию (или конец) в родительском представлении, выполнив что-то вроде этого:
В качестве альтернативы вы можете заменить представление, используя что-то вроде следующего:
источник