Je veux télécharger une image (de taille inconnue, mais qui est toujours à peu près carrée) et l'afficher de manière à ce qu'elle remplisse l'écran horizontalement et s'étire verticalement pour maintenir le rapport hauteur / largeur de l'image, quelle que soit la taille de l'écran. Voici mon code (non fonctionnel). Il étire l'image horizontalement, mais pas verticalement, donc elle est écrasée ...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Réponses:
J'ai accompli cela avec une vue personnalisée. Définissez layout_width = "fill_parent" et layout_height = "wrap_content", et pointez-le vers le dessinable approprié:
la source
En fin de compte, j'ai généré les dimensions manuellement, ce qui fonctionne très bien:
la source
Je viens de lire le code source pour
ImageView
et il est fondamentalement impossible sans utiliser les solutions de sous-classification dans ce fil. DansImageView.onMeasure
nous arrivons à ces lignes:Où
h
etw
sont les dimensions de l'image, etp*
est le remplissage.Puis:
Donc, si vous avez un
layout_height="wrap_content"
il va définirwidthSize = w + pleft + pright
, ou en d'autres termes, la largeur maximale est égale à la largeur de l'image.Cela signifie qu'à moins de définir une taille exacte, les images ne sont JAMAIS agrandies . Je considère cela comme un bogue, mais bonne chance pour que Google le remarque ou le répare. Edit: Manger mes propres mots, j'ai soumis un rapport de bogue et ils disent qu'il a été corrigé dans une prochaine version!
Une autre solution
Voici une autre solution de contournement sous-classée, mais vous devriez (en théorie, je ne l'ai pas vraiment beaucoup testé!) Pouvoir l'utiliser n'importe où
ImageView
. Pour l'utiliser, définissezlayout_width="match_parent"
etlayout_height="wrap_content"
. C'est aussi beaucoup plus général que la solution acceptée. Par exemple, vous pouvez adapter à la hauteur et à la largeur.la source
Définir AdjustViewBounds sur true et utiliser un groupe de vues LinearLayout a très bien fonctionné pour moi. Pas besoin de sous-classer ou de demander des métriques de périphérique:
la source
Je me débat avec ce problème sous une forme ou une autre depuis AGES, merci, merci, MERCI .... :)
Je voulais juste souligner que vous pouvez obtenir une solution généralisable à partir de ce que Bob Lee a fait en étendant simplement View et en remplaçant onMeasure. De cette façon, vous pouvez l'utiliser avec n'importe quel dessin de votre choix, et il ne se cassera pas s'il n'y a pas d'image:
la source
Dans certains cas, cette formule magique résout magnifiquement le problème.
Pour tous ceux qui ont des difficultés avec cela provenant d'une autre plate-forme, l' option "taille et forme pour s'adapter" est gérée à merveille dans Android, mais elle est difficile à trouver.
Vous voulez généralement cette combinaison:
Ensuite, c'est automatique et incroyable.
Si vous êtes un développeur iOS, il est tout à fait étonnant de voir à quel point, sous Android, vous pouvez faire des "hauteurs de cellule totalement dynamiques" dans une vue de tableau ... euh, je veux dire ListView. Prendre plaisir.
la source
J'ai réussi à y parvenir en utilisant uniquement ce code XML. Il se peut qu'éclipse ne rende pas la hauteur pour la montrer s'étendant pour s'adapter; cependant, lorsque vous l'exécutez réellement sur un périphérique, il restitue correctement et fournit le résultat souhaité. (enfin au moins pour moi)
la source
src
et ImageView est devenu proportionnel.Je l'ai fait avec ces valeurs dans un LinearLayout:
la source
Tout le monde fait cela par programme, alors j'ai pensé que cette réponse conviendrait parfaitement ici. Ce code a fonctionné pour mon dans le xml. Je ne pense pas encore au ratio, mais je voulais toujours placer cette réponse si cela pouvait aider quelqu'un.
À votre santé..
la source
Une solution très simple consiste simplement à utiliser les fonctionnalités fournies par
RelativeLayout
.Voici le xml qui le rend possible avec Android standard
Views
:L'astuce est que vous définissez le
ImageView
pour remplir l'écran mais il doit être au-dessus des autres mises en page. De cette façon, vous obtenez tout ce dont vous avez besoin.la source
Sa simple question de réglage
adjustViewBounds="true"
etscaleType="fitCenter"
dans le fichier XML pour ImageView!Remarque:
layout_width
est réglé surmatch_parent
la source
Vous définissez ScaleType sur ScaleType.FIT_XY. Selon les javadocs , cela étendra l'image pour l'adapter à toute la zone, en modifiant le rapport hauteur / largeur si nécessaire. Cela expliquerait le comportement que vous observez.
Pour obtenir le comportement souhaité ... FIT_CENTER, FIT_START ou FIT_END sont proches, mais si l'image est plus étroite que haute, elle ne commencera pas à remplir la largeur. Vous pouvez cependant regarder comment ceux-ci sont mis en œuvre et vous devriez probablement être en mesure de déterminer comment l'ajuster à votre objectif.
la source
ScaleType.CENTER_CROP fera ce que vous voulez: étirer en pleine largeur et mettre à l'échelle la hauteur en conséquence. si la hauteur mise à l'échelle dépasse les limites de l'écran, l'image sera recadrée.
la source
Regardez, il existe une solution beaucoup plus simple à votre problème:
la source
Vous pouvez utiliser mon StretchableImageView en préservant le rapport hauteur / largeur (par largeur ou par hauteur) en fonction de la largeur et de la hauteur du dessinable:
la source
Pour moi, l'android: scaleType = "centerCrop" n'a pas résolu mon problème. Cela a en fait élargi davantage l'image. J'ai donc essayé avec android: scaleType = "fitXY" et cela fonctionnait très bien.
la source
Cela fonctionne bien selon mon exigence
<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>
la source