Як я можу змінити положення зору за допомогою коду? Як і зміна свого X, Y положення. Це можливо?
Як я можу змінити положення зору за допомогою коду? Як і зміна свого X, Y положення. Це можливо?
Відповіді:
Що-небудь нижче сотового (API рівня 11) вам доведеться використовувати setLayoutParams(...)
.
Якщо ви можете обмежити підтримку Honeycomb і вище , ви можете використовувати setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
і т.д.
Так, ви можете динамічно встановлювати положення перегляду в Android. Точно так же у вас є ImageView
в LinearLayout
вашій XML file.So ви можете встановити свою позицію через LayoutParams
.Але не забудьте взяти в LayoutParams
відповідно до розташування , прийнятим у вашій XML file.There різні в 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
поля заповнюються з відповідних макетпарм у макеті (). Система макета перегляду Android виразно та асинхронно називає макет. Таким чином, встановлення, MarginLayoutParams
здається, є найбезпечнішим і найчистішим способом постійного встановлення положення. Однак затримка асинхронного макета може бути проблемою в деяких випадках, наприклад, при використанні View для візуалізації курсору, і він повинен бути перестановлений і одночасно служити якорем PopupMenu. У цьому випадку дзвінки layout()
спрацювали мені добре.
Проблеми з setLeft()
та setTop()
є:
Викликати їх самотужки недостатньо - вам також потрібно зателефонувати setRight()
та setBottom()
уникати розтягування чи зменшення виду.
Реалізація цих методів виглядає відносно складною (= виконання певної роботи для врахування змін розміру перегляду, викликаних кожним із них)
Здається, вони викликають дивні проблеми з полями введення: м'яка цифрова клавіатура EditText іноді не дає цифр
setX()
і setY()
працювати поза системою компонування, і відповідні значення розглядаються як додаткове зміщення до значень ліво / верх / низ / право, визначене системою компонування, зміщуючи подання відповідно. Вони, здається, додані для анімації (де потрібен негайний ефект без проходження циклу компонування).
marginLeft
можна встановити, використовуючи за допомогою setLayoutParams
того, new FrameLayout.LayoutParams(width, height)
на якому ви встановилиmarginLeft
Існує бібліотека під назвою NineOldAndroids , яка дозволяє використовувати бібліотеку анімації стільникових мереж аж до першої версії.
Це означає, що ви можете визначити лівий, правий, translationX / Y з дещо іншим інтерфейсом.
Ось як це працює:
ViewHelper.setTranslationX(view, 50f);
Ви просто використовуєте статичні методи з класу ViewHelper, передаєте подання та яке значення, яке ви хочете встановити.
Я б рекомендував використовувати setTranslationX
і setTranslationY
. Я лише зараз починаю це робити, але це, мабуть, є найбезпечнішим і бажаним способом перегляду огляду. Я думаю, це дуже залежить від того, що саме ти намагаєшся зробити, але це для мене добре працює для 2D-анімації.
Якщо ви використовуєте HoneyComb Sdk (API рівня 11), ви можете спробувати скористатися такими методами.
view.setX(float 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);
Примітка. Зауважте, що ви можете також використовувати 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.
- то, може, це не така гарна ідея;)