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?

80
demandé sur Suragch 2011-06-30 17:39:39

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.

104
répondu Perishable Dave 2012-09-26 05:32:23

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.

40
répondu AkashG 2012-09-26 13:06:44

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.

18
répondu Ben 2016-06-17 11:23:00

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), mettez marginLeft / 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'utiliser setX() / 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() et setBottom() 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).

18
répondu Stefan Haustein 2017-05-23 12:34:50

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.

14
répondu brianmearns 2012-09-03 19:25:41

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. :)

10
répondu Chickenrice 2011-06-30 15:17:32

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.

5
répondu Balaji.K 2017-07-14 09:14:09

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.

4
répondu Ale Muzzi 2014-04-08 09:57:49

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.

3
répondu glodos 2014-02-02 07:33:11

pour prendre en charge tous les niveaux de L'API, vous pouvez utiliser it comme ceci:

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
3
répondu Orr 2016-06-17 11:27:51

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érence setLeft() et setX() )
  • 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 .
0
répondu Nguyen Tan Dat 2018-08-23 10:53:33