Comment puis-je changer la position de la vue via le code? Comme changer sa position X, Y. C'est possible?
102
Pour tout ce qui est en dessous de Honeycomb (niveau d'API 11), vous devrez utiliser setLayoutParams(...)
.
Si vous pouvez limiter votre soutien à nid d' abeille et en vous pouvez utiliser setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, etc.
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.
- alors peut-être que ce n'est pas une bonne idée;)Oui, vous pouvez définir dynamiquement la position de vue sous Android. De même, vous avez un
ImageView
inLinearLayout
de votre fichier xml.Vous pouvez donc définir sa position viaLayoutParams
.Mais assurez-vous de prendre enLayoutParams
fonction de la mise en page prise dans votre fichier xml.Il y en a différentesLayoutParams
selon la mise en page prise.Voici le code à définir:
J'espère qu'il vous sera utile de vous positionner.
la source
Il existe déjà différentes réponses valides, 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 mise en page et que le groupe de vues parent prend en charge
MarginLayoutParams
(ou une sous-classe), définissezmarginLeft
/ enmarginTop
conséquence.Si vous avez besoin de changer la position immédiatement et de manière persistante (par exemple pour une ancre PopupMenu), appelez en plus
layout(l, t, r, b)
avec les mêmes coordonnées. Cela prévient ce que le système de mise en page confirmera plus tard.Pour les modifications immédiates (temporaires) (telles que les animations), utilisez
setX()
/ à lasetY()
place. Dans les cas où la taille du parent ne dépend pas de WRAP_CHILDREN, il peut être bon d'utilisersetX()
/setY()
exclusivement.Ne jamais utiliser
setLeft()
/setRight()
/setBottom()
/setTop()
, voir ci - dessous.Contexte : 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 mise en page de vue Android. Ainsi, le réglageMarginLayoutParams
semble être le moyen le plus sûr et le plus propre de régler la position de façon permanente. Cependant, le décalage 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 repositionné et servir en même temps d'ancre PopupMenu. Dans ce cas, l'appellayout()
a bien fonctionné pour moi.Les problèmes avec
setLeft()
etsetTop()
sont:Les appeler seuls ne suffit pas - vous devez également appeler
setRight()
etsetBottom()
éviter d'étirer ou de réduire la vue.La mise en œuvre de ces méthodes semble relativement complexe (= faire du travail pour tenir compte des changements de taille de vue causés par chacune d'elles)
Ils semblent causer des problèmes étranges avec les champs de saisie: le clavier numérique souple EditText n'autorise parfois pas les chiffres
setX()
etsetY()
travailler en dehors du système de mise en page, et les valeurs correspondantes sont traitées comme un décalage supplémentaire vers les valeurs gauche / haut / bas / droite déterminées par le système de mise en page, décalant 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).la source
marginLeft
peut être défini en utilisantsetLayoutParams
avec unnew FrameLayout.LayoutParams(width, height)
sur lequel vous définissez lemarginLeft
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 gauche, droite, translationX / Y avec une interface légèrement différente.
Voici comment cela fonctionne:
Vous utilisez simplement les méthodes statiques de la classe ViewHelper, passez la vue et la valeur à laquelle vous souhaitez la définir.
la source
Je recommanderais d'utiliser
setTranslationX
etsetTranslationY
. Je ne fais que commencer moi-même, mais cela semble être le moyen le plus sûr et le plus préféré 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.la source
Vous pouvez essayer d'utiliser les méthodes suivantes, si vous utilisez HoneyComb Sdk (API niveau 11).
Le paramètre x est la position visuelle x de cette vue.
Le paramètre y est la position visuelle y de cette vue.
J'espère que cela vous sera utile. :)
la source
Vous pouvez utiliser pour le soutien à tous les niveaux de l' API , il présente comme suit:
la source
Définissez la position gauche de cette vue par rapport à son parent:
Définissez la bonne position de cette vue par rapport à son parent:
Définissez la position supérieure de cette vue par rapport à son parent:
Définissez la position inférieure de cette vue par rapport à son parent:
Les méthodes ci-dessus sont utilisées pour définir la position de la vue liée à son parent.
la source
Utilisez LayoutParams. Si vous utilisez un LinearLayout, vous devez importer android.widget.LinearLayout.LayoutParams, sinon importez la version appropriée de LayoutParams pour la mise en page que vous utilisez, sinon cela provoquera une ClassCastException , alors:
NB: Notez que vous pouvez également utiliser imageView.setLeft (int dim), MAIS CELA 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 .
la source
Utilisez
RelativeLayout
, placez votre vue dedans, récupérez unRelativeLayout.LayoutParams
objet de votre vue et définissez les marges selon vos besoins. Appelez ensuiterequestLayout()
votre vue. C'est le seul moyen que je connaisse.la source
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()
ne fonctionnera pas parfois.setX()
setY()
simplement / à la place. (Vous voudrez peut-être rechercher plus de différencesetLeft()
etsetX()
)la source
Une chose à garder à l'esprit avec le positionnement est que chaque vue a un index par rapport à sa vue parente. Donc, si vous avez une mise en page linéaire avec trois sous-vues, les sous-vues auront chacune un index: 0, 1, 2 dans le cas ci-dessus.
Cela vous permet d'ajouter une vue à la dernière position (ou à la fin) dans une vue parent en faisant quelque chose comme ceci:
Vous pouvez également remplacer une vue en utilisant quelque chose comme ce qui suit:
la source