J'ai une vue d'image. Je veux que sa largeur soit fill_parent. Je veux que sa hauteur soit quelle que soit la largeur finie par être. Par exemple:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
Est-ce que quelque chose comme ça est possible dans un fichier de mise en page sans avoir à créer ma propre classe de vue?
Merci
Réponses:
Mise à jour: 14 septembre 2017
Selon un commentaire ci-dessous, la bibliothèque de support pour cent est obsolète à partir de la bibliothèque de support Android 26.0.0. Voici la nouvelle façon de procéder:
Voir ici
Obsolète:
Selon cet article de développeurs Android, tout ce que vous avez à faire maintenant est d'envelopper ce que vous voulez dans un PercentRelativeLayout ou un PercentFrameLayout, puis spécifiez ses ratios, comme ceci
la source
Peut-être que cela répondra à votre question:
Vous pouvez ignorer l'
scaleType
attribut pour cette situation particulière.la source
Cela peut être fait en utilisant LayoutParams pour définir dynamiquement la hauteur des vues une fois que vous connaissez la largeur des vues au moment de l'exécution. Vous devez utiliser un thread exécutable pour obtenir la largeur des vues au moment de l'exécution, sinon vous allez essayer de définir la hauteur avant de connaître la largeur de la vue, car la mise en page n'a pas encore été dessinée.
Exemple de résolution de mon problème:
Les LayoutParams doivent être du type de la vue parent dans laquelle se trouve votre vue. Mon FrameLayout est à l'intérieur d'un RelativeLayout dans le fichier xml.
est appelée pour forcer la vue à se redessiner lorsqu'elle est sur un thread distinct du thread d'interface
la source
onMeasure
, comme le montre la réponse de Régis . Une alternative, mais uniquement pour les vues rendues via un adaptateur, par exemple à l'intérieurGridView
, est la réponse de Matt .requestLayout()
après avoir réglé les paramètres. pourquoi cela serait-il?Je n'ai pas pu faire fonctionner la réponse de David Chu pour un élément RecyclerView et j'ai compris que je devais contraindre ImageView au parent. Définissez la largeur ImageView sur
0dp
et contraignez son début et sa fin au parent. Je ne sais pas si la définition de la largeur surwrap_content
oumatch_parent
fonctionne dans certains cas, mais je pense que c'est un meilleur moyen de faire en sorte que l'enfant d'un ConstraintLayout remplisse son parent.la source
Voilà ce que j'ai fait pour avoir un ImageButton qui a toujours une largeur égale à sa hauteur (et éviter les marges vides stupides dans un sens ... ce que je considère comme un bug du SDK ...):
J'ai défini une classe SquareImageButton qui s'étend de ImageButton:
Voici mon xml:
Fonctionne comme un charme!
la source
Si votre vue d'image se trouve dans une mise en page de contraintes, vous pouvez utiliser les contraintes suivantes pour créer une vue d'image carrée
la source
Dans Android 26.0.0, PercentRelativeLayout est obsolète .
La meilleure façon de le résoudre est maintenant avec
ConstraintLayout
comme ceci:Voici un tutoriel sur la façon d'ajouter
ConstraintLayout
à votre projet.la source
Vous ne pouvez pas le faire avec la mise en page seule, j'ai essayé. J'ai fini par écrire une classe très simple pour la gérer, vous pouvez la vérifier sur github. SquareImage.java Il fait partie d'un projet plus vaste mais rien qu'un petit copier-coller ne peut corriger (sous licence Apache 2.0)
Il vous suffit essentiellement de définir la hauteur / largeur égale à l'autre dimension (en fonction de la manière dont vous souhaitez la mettre à l'échelle)
Remarque: vous pouvez le rendre carré sans classe personnalisée à l'aide de l'
scaleType
attribut, mais les limites de la vue s'étendent au-delà de l'image visible, ce qui pose un problème si vous placez d'autres vues à proximité.la source
Pour définir votre ImageView égale à la moitié de l'écran, vous devez ajouter ce qui suit à votre XML pour ImageView:
Pour définir ensuite la hauteur égale à cette largeur, vous devez le faire dans le code. Dans la
getView
méthode de votreGridView
adaptateur, définissez laImageView
hauteur égale à sa largeur mesurée:la source
Pour les gens de passage maintenant, en 2017, la nouvelle meilleure façon d'obtenir ce que vous voulez est d'utiliser ConstraintLayout comme ceci:
Et n'oubliez pas d'ajouter des contraintes aux quatre directions selon les besoins de votre mise en page.
Créer une interface utilisateur réactive avec ConstraintLayout
De plus, à présent, PercentRelativeLayout est obsolète (voir la documentation Android ).
la source
Voici comment j'ai résolu ce problème:
aperçu - imageView avec une largeur définie sur "match_parent" et scaleType sur "cropCenter"
picture - Objet bitmap à définir dans imageView src.
Cela fonctionne plutôt bien pour moi.
la source
= vw*ph/pw
au lieu du plus simple= vw
. (Je pense que vous faites cela pour préserver le rapport hauteur / largeur de l'image source, plutôt que de forcer un aperçu carré.)Je ne pense pas que vous puissiez le faire dans un fichier de mise en page XML, et je ne pense pas que l'
android:scaleType
attribut fonctionnera comme vous le souhaitez.Le seul moyen serait de le faire par programme. Vous pouvez définir la largeur sur fill_parent et prendre la largeur de l'écran comme hauteur de la méthode
View
ou utiliser laView.getWidth()
méthode.la source
La fonction ImageView "scaleType" peut vous aider ici.
Ce code conservera le rapport hauteur / largeur et positionnera l'image en haut:
Voici un excellent article montrant les possibilités et les apparences de l'utilisation de scaleType.
Exemples d'ImageView scaleType
la source
j'ai aimé ça -
la source