Comment définir dynamiquement la position de vue sur Android?
Comment changer la position de vue à travers le code? Comme le changement de sa position X, Y. Est-il possible?
11 réponses
pour tout ce qui est en dessous de Honeycomb (niveau API 11), vous devrez utiliser setLayoutParams(...)
.
si vous pouvez limiter votre soutien à Honeycomb et vers le haut, vous pouvez utiliser le setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, etc.
Oui, vous pouvez régler dynamiquement la position de vue dans Android. De même, vous avez un ImageView
dans LinearLayout
de votre fichier xml.Donc vous pouvez définir sa position par LayoutParams
.Mais assurez-vous de prendre LayoutParams
selon la mise en page prise dans votre fichier xml.Il y a différentes LayoutParams
selon la disposition prise.
voici le code à définir:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
j'espère qu'il vous sera utile de définir la position.
il y a une bibliothèque appelée NineOldAndroids , qui vous permet d'utiliser la bibliothèque D'animation Honeycomb tout le chemin vers la version un.
cela signifie que vous pouvez définir gauche, droite, translationX/Y avec une interface légèrement différente.
Voici comment ça marche:
ViewHelper.setTranslationX(view, 50f);
vous n'utilisez que les méthodes statiques de la classe ViewHelper, passez la vue et la valeur à laquelle vous voulez la définir.
il existe déjà différentes réponses valables, mais aucune ne semble suggérer correctement quelle(s) méthode (s) utiliser dans ce cas, sauf pour les restrictions de niveau API correspondantes:
-
si vous pouvez attendre un cycle de mise en page et que le groupe de vue parent supporte
MarginLayoutParams
(ou une sous-classe), mettezmarginLeft
/marginTop
en conséquence. -
si vous devez changer la position immédiatement et en permanence (par exemple pour une ancre PopupMenu), appeler en plus
layout(l, t, r, b)
avec les mêmes coordonnées. Cela préempte ce que le système de mise en page confirmera plus tard. -
pour les changements immédiats (temporaires) (tels que les animations), utilisez
setX()
/setY()
à la place. Dans les cas où la taille du parent ne dépend pas de WRAP_CHILDREN, il peut être bon d'utilisersetX()
/setY()
exclusivement. -
Jamais utilisation
setLeft()
/setRight()
/setBottom()
/setTop()
, voir ci-dessous.
arrière-plan :
Les mLeft
/ mTop
/ mBottom
/ mRight
les champs sont remplis à partir de LayoutParams correspondante dans layout(). La mise en page est appelée implicitement et asynchrone par le système de mise en page Android view. Ainsi, le réglage du MarginLayoutParams
semble être le plus sûr et le moyen le plus propre pour régler la position de façon permanente. Cependant, le retard de disposition asynchrone peut être un problème dans certains cas, par exemple lors de l'utilisation d'une vue pour rendre un curseur, et il est supposé être re-positionné et servir D'ancre PopupMenu en même temps. Dans ce cas, appeler layout()
a bien fonctionné pour moi.
les problèmes avec setLeft()
et setTop()
sont:
-
les appeler seuls n'est pas suffisant -- vous il faut aussi appeler
setRight()
etsetBottom()
pour éviter d'étirer ou de rétrécir la vue. -
la mise en œuvre de ces méthodes semble relativement complexe (= faire un peu de travail pour tenir compte des changements de taille de la vue causés par chacune d'elles)
-
ils semblent causer des problèmes étranges avec les champs d'entrée: EditText soft clavier numérique parfois ne permet pas de chiffres
setX()
et setY()
travaillent en dehors du système de layout, et les valeurs correspondantes sont traitées comme un décalage supplémentaire par rapport aux valeurs GAUCHE / HAUT / BAS / DROITE déterminées par le système de layout, changeant la vue en conséquence. Ils semblent avoir été ajoutés pour les animations (où un effet immédiat sans passer par un cycle de mise en page est requis).
je recommande d'utiliser setTranslationX
et setTranslationY
. Je ne fais que commencer moi-même, mais ceux-ci semblent être la façon la plus sûre et préférée de déplacer une vue. Je suppose que cela dépend beaucoup de ce que vous essayez de faire exactement, mais cela fonctionne bien pour moi pour l'animation 2D.
vous pouvez essayer d'utiliser les méthodes suivantes, si vous utilisez HoneyComb Sdk(API Niveau 11).
view.setX(float x);
le paramètre x est la position visuelle x de cette vue.
view.setY(float y);
le paramètre y est la position visuelle y de cette vue.
j'espère que cela vous sera utile. :)
placer la position gauche de cette vue par rapport à sa parent:
view.setLeft(int leftPosition);
placer la bonne position de cette vue par rapport à son parent:
view.setRight(int rightPosition);
placer la position supérieure de cette vue par rapport à son parent:
view.setTop(int topPosition);
placer la position inférieure de cette vue par rapport à sa parent:
view.setBottom(int bottomPositon);
les méthodes ci-dessus sont utilisées pour définir la position de la vue par rapport à son parent.
Utiliser LayoutParams. Si vous utilisez une LinearLayout vous devez importer android.widget.LinearLayout.LayoutParams, sinon importez la bonne version de LayoutParams pour le layout que vous utilisez, ou cela causera une ClassCastException , puis:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
NB: notez que vous pouvez aussi utiliser imageView.setLeft (int dim), mais cela ne positionne pas la position du composant, il ne positionne que la position de la bordure gauche du composant, le reste reste à la même position.
utilisez RelativeLayout
, placez votre vue dedans, obtenez RelativeLayout.LayoutParams
objet de votre vue et réglez les marges comme vous avez besoin. Alors appelez requestLayout()
sur votre vue. C'est la seule façon que je sais.
j'ai trouvé que @Stefan Haustein est très proche de mon expérience, mais pas sûr à 100%. Ma suggestion est:
-
setLeft()
/setRight()
/setBottom()
/setTop()
ça ne marchera pas parfois. - Si vous voulez définir un poste temporairement (e.g pour faire de l'animation, pas touché une hiérarchie) quand le point de vue a été ajouté et montré , juste utiliser
setX()
/setY()
à la place. (Vous pourriez vouloir rechercher plus dans différencesetLeft()
etsetX()
) - et notez que X, Y semblent être absolu, et il a été soutenu par AbsoluteLayout qui est maintenant déprécié. Ainsi, vous sentez que X, Y n'est probablement plus supporté. Et oui, il est, mais seulement en partie. Cela signifie que si votre vue est ajoutée, setX (), setY () fonctionnera parfaitement ; sinon, quand vous essayez de ajouter une vue dans la mise en page de groupe de vue (E. G FrameLayout, LinearLayout, RelativeLayout), vous doit définir ses paramétrages avec marginLeft, marginTop à la place (setX (), setY () dans ce cas ne fonctionnera pas parfois).
- Définir la position de la vue par le marginleft et marginTop est un désynchroniser . Donc il a besoin d'un peu de temps pour mettre à jour la hiérarchie . Si vous utilisez la vue immédiatement après la marge de jeu pour elle, vous pourrait obtenir une mauvaise valeur .