Comment puis-je changer la position de la vue par le code? Comme changer sa position X, Y. C'est possible?
Pour tout ce qui se trouve en dessous de Honeycomb (API niveau 11), vous devrez utiliser setLayoutParams(...)
.
Si vous pouvez limiter votre assistance à Honeycomb et plus, vous pouvez utiliser les fonctions setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, etc.
Oui, vous pouvez définir de manière dynamique la position de la vue dans Android. De même, vous avez une ImageView
dans LinearLayout
de votre fichier xml. Vous pouvez donc définir sa position par le biais de LayoutParams
. Mais assurez-vous de prendre LayoutParams
en fonction de la mise en page prise dans votre fichier xml. Il existe différents LayoutParams
en fonction de la mise en page 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 que cela vous sera utile de définir votre position.
Il existe déjà différentes réponses valables, mais aucune ne semble suggérer correctement la ou les méthodes à utiliser, auquel cas, à l'exception des restrictions de niveau d'API correspondantes:
Si vous pouvez attendre un cycle de présentation et que le groupe de vues parent prend en charge MarginLayoutParams
(ou une sous-classe), définissez marginLeft
marginTop
en conséquence.
Si vous devez modifier la position immédiatement et de manière persistante (par exemple, pour une ancre PopupMenu), appelez en outre layout(l, t, r, b)
avec les mêmes coordonnées. Ceci préempte ce que le système de mise en page confirmera plus tard.
Pour les modifications immédiates (temporaires) (telles que les animations), utilisez plutôt setX()
/setY()
. Dans les cas où la taille du parent ne dépend pas de WRAP_CHILDREN, il pourrait être correct d’utiliser exclusivement setX()
/setY()
.
_/Jamais utilisez setLeft()
setRight()
/setBottom()
/setTop()
, voir ci-dessous.
_/Background: Les champs mLeft
/mTop
/mBottom
/mRight
sont remplis à partir des LayoutParams correspondants dans layout (). La mise en page est appelée implicitement et de manière asynchrone par le système de présentation de vues Android. Ainsi, définir MarginLayoutParams
semble être le moyen le plus sûr et le plus propre de définir la position de manière permanente. Cependant, le décalage de présentation asynchrone peut poser problème dans certains cas, par exemple. lorsque vous utilisez une vue pour rendre un curseur, celui-ci est supposé être repositionné 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 suivants:
Les appeler seuls ne suffit pas - vous devez également appeler setRight()
et setBottom()
pour éviter d'étirer ou de réduire la vue.
L'implémentation de ces méthodes semble relativement complexe (= faire un travail pour prendre en compte les changements de taille de vue causés par chacune d'elles)
Ils semblent provoquer des problèmes étranges avec les champs de saisie: Le clavier numérique souple EditText n'autorise parfois pas les chiffres
setX()
et setY()
fonctionnent en dehors du système de présentation, 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 présentation, ce qui déplace 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).
Il existe une bibliothèque appelée NineOldAndroids , qui vous permet d’utiliser la bibliothèque d’animation Honeycomb jusqu’à la première version.
Cela signifie que vous pouvez définir left, right, translationX/Y avec une interface légèrement différente.
Voici comment cela fonctionne:
ViewHelper.setTranslationX(view, 50f);
Vous utilisez simplement les méthodes statiques de la classe ViewHelper, transmettez la vue et la valeur de votre choix.
Je recommanderais d'utiliser setTranslationX
et setTranslationY
. Je commence tout juste à commencer moi-même, mais cela semble être le moyen le plus sûr et préféré de déplacer une vue. Je suppose que cela dépend beaucoup de ce que vous essayez exactement de faire, 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. :)
Pour prendre en charge tous les niveaux d’API, vous pouvez utiliser it comme ceci:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Utilisez LayoutParams . Si vous utilisez un LinearLayout, vous devez importer Android.widget.LinearLayout.LayoutParams, sinon importez la version appropriée de LayoutParams pour la présentation que vous utilisez, sinon cela provoquera un 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 CECI NE FIXERA PAS la position du composant, il ne définira que la position du bord gauche du composant, le reste restera à la Même position.
Définissez la position gauche de cette vue par rapport à son parent:
view.setLeft(int leftPosition);
Définissez la bonne position de cette vue par rapport à son parent:
view.setRight(int rightPosition);
Définissez la position supérieure de cette vue par rapport à son parent:
view.setTop(int topPosition);
Définissez la position inférieure de cette vue par rapport à son parent:
view.setBottom(int bottomPositon);
Les méthodes ci-dessus permettent de définir la position de la vue par rapport à son parent.
Utilisez RelativeLayout
, placez votre vue dessus, obtenez l’objet RelativeLayout.LayoutParams
de votre vue et définissez les marges selon vos besoins. Ensuite, appelez requestLayout()
à votre avis. C'est la seule façon que je connaisse.