Android: Comment faire pour étirer une image à la largeur de l'écran tout en conservant les proportions?
Je veux télécharger une image (de taille inconnue, mais qui est toujours à peu près carrée) et de l'afficher afin qu'elle remplisse l'écran à l'horizontale, et s'étend verticalement à maintenir le ratio d'aspect de l'image, sur la taille de l'écran. Voici ma (non-travail) du code. Il s'étend sur l'image horizontalement mais pas verticalement, de sorte qu'il est écrasé...
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));
- faire tous les appareils Android ont exactement le même rapport largeur/hauteur? Si non, il est tout simplement impossible à l'échelle d'une image adaptée à l'ensemble de la largeur ou de la hauteur, tout en préservant le rapport original...
- Non, je ne veux pas l'image pour remplir l'écran, juste à l'échelle de la largeur de l'écran, je ne m'inquiète pas combien de l'écran, l'image prend à la verticale, aussi longtemps que l'image est dans les proportions correctes.
- La même question, la bonne réponse: stackoverflow.com/questions/4677269/...
- n' 'adjustViewBounds" pas de travail?
Vous devez vous connecter pour publier un commentaire.
Que j'ai accompli cela avec une vue personnalisée. Ensemble layout_width="fill_parent" et layout_height="wrap_content", et le point à la drawable:
onMeasure()
àfloat
temporairement pour plus d'division précise des résultats, et par la suite jeté aux résultats deint
?En fin de compte, j'ai généré les dimensions manuellement, ce qui fonctionne très bien:
Je viens de lire le code source pour
ImageView
et il est pratiquement impossible sans l'aide de la sous-classement des solutions dans ce thread. DansImageView.onMeasure
nous arrivons à ces lignes:Où
h
etw
sont les dimensions de l'image, etp*
est le remplissage.Et puis:
Donc si vous avez un
layout_height="wrap_content"
il sera mis enwidthSize = w + pleft + pright
, ou en d'autres termes, la largeur maximale est égale à la largeur de l'image.Cela signifie que , sauf si vous définissez une taille exacte, les images ne sont JAMAIS élargie. Je considère que cela est un bug, mais bonne chance pour Google de prendre l'avis ou le fixer. Edit: Manger mes propres mots, j'ai soumis un rapport de bogue et ils disent qu'il a été corrigé dans une future version!
Une autre solution
Voici un autre sous-classé solution de contournement, mais vous devrait (en théorie, je n'ai pas vraiment testé beaucoup!) être en mesure de l'utiliser partout où vous
ImageView
. Pour l'utiliser ensemblelayout_width="match_parent"
, etlayout_height="wrap_content"
. Il est beaucoup plus générale que la solution retenue aussi. E. g. vous pouvez le faire adapter à la hauteur ainsi que l'ajustement à la largeur.Réglage adjustViewBounds à vrai et à l'aide d'un LinearLayout vue groupe a travaillé très bien pour moi. Pas besoin de sous-classe ou demander des mesures de l'appareil:
J'ai été aux prises avec ce problème sous une forme ou une autre depuis des lustres, merci, merci, Merci.... 🙂
Je voulais juste faire remarquer que vous pouvez obtenir une solution généralisable à partir de ce que Bob Lee se fait par simple extension de la Vue et de l'impérieuse onMeasure. De cette façon, vous pouvez l'utiliser avec n'importe quel drawable vous voulez, et il ne cassera pas si il n'y a pas d'image:
Dans certains cas, cette formule magique magnifiquement résout le problème.
Pour quelqu'un aux prises avec cette venue d'une autre plate-forme, le "la taille et la forme de l'ajustement" option est géré à merveille dans Android, mais il est difficile à trouver.
Vous souhaitez généralement cette combinaison:
Ensuite c'est automatique et incroyable.
Si vous êtes un dev iOS, c'est absolument incroyable de voir comment vous pouvez faire "totalement dynamique de la hauteur de cellule" dans un affichage tableau .. euh, je veux dire ListView. Profitez de.
J'ai réussi à atteindre cet objectif en utilisant ce code XML seulement. Cela pourrait être le cas que eclipse ne rend pas la hauteur pour montrer l'expansion de l'ajustement; cependant, lorsque vous exécutez ce code sur un appareil, il rend correctement et fournit le résultat souhaité. (eh bien, au moins pour moi)
src
et de l'ImageView est devenu proportionnelle.Je l'ai fait avec ces valeurs dans un LinearLayout:
Tout le monde est en train de faire ce programmily j'ai donc pensé que cette réponse serait parfaitement ici. Ce code a fonctionné pour mon dans le xml. Im ne PAS penser à la ratio encore, mais je voulais placer cette réponse si cela peut aider quelqu'un.
Acclamations..
Une solution très simple consiste à n'utiliser que les fonctionnalités fournies par
RelativeLayout
.Voici le code xml qui rend cela possible avec Android standard
Views
:Le truc, c'est que vous définissez la
ImageView
pour remplir l'écran, mais il doit être au-dessus de l'autre. De cette façon, vous obtenir tout ce dont vous avez besoin.Sa simple question de réglage
adjustViewBounds="true"
etscaleType="fitCenter"
dans le fichier XML pour l'ImageView!Remarque:
layout_width
est fixé àmatch_parent
Vous définissez la ScaleType à ScaleType.FIT_XY. Selon le la documentation javadoc, ce sera étirer l'image pour l'adapter à l'ensemble de la zone, modification de l'aspect ratio, si nécessaire. Qui pourrait expliquer le comportement que vous voyez.
Pour obtenir le comportement que vous voulez... FIT_CENTER, FIT_START, ou FIT_END sont proches, mais si l'image est plus étroit que c'est grand, il ne sera pas commencer à remplir la largeur. Vous pourriez regarder comment ceux-ci sont mis en œuvre, cependant, et vous devriez probablement être en mesure de comprendre comment l'ajuster en fonction de votre but.
ScaleType.CENTER_CROP faire ce que vous souhaitez: étirement de toute la largeur, et l'échelle de la hauteur en conséquence. si à l'échelle de la hauteur dépasse les limites de l'écran, l'image sera rognée.
Regarde, il est beaucoup plus facile de solution à votre problème:
Vous pouvez utiliser mon StretchableImageView préservant l'aspect ratio (en largeur ou en hauteur) en fonction de la largeur et de la hauteur de drawable:
Pour moi le android:scaleType="centerCrop" n'a pas résolu mon problème. Il fait élargi l'image de manière plus. J'ai donc essayé avec android:scaleType="fitXY" et Il a travaillé excellent.
Ce travail bien que par mon exigence
<ImageView
android:id="@+id/imgIssue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"/>