591 votes

Comment mettre à l'échelle une image dans ImageView pour conserver le rapport d'aspect ?

Dans Android, j'ai défini un ImageView 's layout_width à être fill_parent (qui occupe toute la largeur du téléphone).

Si l'image que je mets à ImageView est plus grande que la layout_width Android va le mettre à l'échelle, non ? Mais qu'en est-il de la hauteur ? Quand Android met l'image à l'échelle, garde-t-il le rapport d'aspect ?

Ce que je découvre, c'est qu'il y a des espaces blancs en haut et en bas de l'écran. ImageView lorsqu'Android met à l'échelle une image qui est plus grande que la taille de l'écran. ImageView . Est-ce que c'est vrai ? Si oui, comment puis-je éliminer cet espace blanc ?

887voto

Steve Haley Points 26928
  1. Oui, par défaut, Android réduira l'échelle de votre image pour l'adapter à l'ImageView, en conservant le rapport d'aspect. Cependant, assurez-vous de définir l'image dans l'ImageView à l'aide de la commande android:src="..." plutôt que android:background="..." . src= permet de mettre à l'échelle l'image en maintenant le rapport d'aspect, mais background= le met à l'échelle et déformer l'image pour qu'elle s'adapte exactement à la taille de l'ImageView. (Vous pouvez cependant utiliser un arrière-plan et une source en même temps, ce qui peut être utile pour des choses comme l'affichage d'un cadre autour de l'image principale, en utilisant une seule ImageView).

  2. Vous devriez également voir android:adjustViewBounds pour que l'ImageView se redimensionne elle-même pour s'adapter à l'image redimensionnée. Par exemple, si vous avez une image rectangulaire dans ce qui serait normalement une ImageView carrée, adjustViewBounds=true fera en sorte que l'ImageView soit également redimensionnée pour être rectangulaire. Cela affecte ensuite la manière dont les autres vues sont disposées autour de l'ImageView.

    Ensuite, comme l'a écrit Samuh, vous pouvez modifier la mise à l'échelle par défaut des images en utilisant l'option android:scaleType paramètre. D'ailleurs, la façon la plus simple de découvrir comment cela fonctionne aurait simplement été d'expérimenter un peu vous-même ! N'oubliez pas de regarder les mises en page dans l'émulateur lui-même (ou un téléphone réel), car l'aperçu dans Eclipse est généralement faux.

0 votes

Merci. Mais que se passe-t-il si j'ai une ImageView, et que je définis l'image en utilisant imageView.setImageBitmap() ?

23 votes

C'est la même chose, mais en code plutôt qu'en XML. setImageBitmap est la même chose que android:src="..." et setBackground... est android:background="..."

0 votes

@SteveHaley Je sais qu'il est trop tard mais pouvez-vous me dire l'équivalent de image.setImageDrawable en code xml.

313voto

Gratzi Points 1351

Voir android:adjustViewBounds .

Attribuez la valeur true si vous souhaitez que l'ImageView ajuste ses limites afin de préserver le rapport d'aspect de son objet à dessiner.

7 votes

C'est la solution correcte pour ce problème. Nous avions ce problème sur notre vue image, où la hauteur incluait tout cet espace blanc supplémentaire. Ce ne sont pas des "pixels transparents", puisque nous avions fill_parent pour la largeur et wrap_content pour la hauteur. Si vous n'avez pas adjustViewBounds=true, vous obtenez l'espace blanc supplémentaire. Après avoir mis cette option à true, notre problème a disparu. Merci !

3 votes

Merci, ceci et le fait de mettre src au lieu de background a parfaitement fonctionné !

0 votes

205voto

Kevin Points 4235

Pour tous ceux qui ont ce problème particulier. Vous avez un ImageView que vous voulez avoir une largeur de fill_parent et une hauteur proportionnelle :

Ajoutez ces deux attributs à votre ImageView :

android:adjustViewBounds="true"
android:scaleType="centerCrop"

Et mettez le ImageView largeur à fill_parent et la hauteur à wrap_content .

De plus, si vous ne voulez pas que votre image soit recadrée, essayez ceci :

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"

20 votes

Oui, mais votre image sera recadrée. La solution parfaite serait d'étirer l'image en largeur, de maintenir le rapport d'aspect et de ne pas la recadrer. Je ne sais pas pourquoi c'est si difficile à faire...

1 votes

Moi non plus :( Désolé si ma solution ne vous a pas aidé, mais elle m'a aidé.

2 votes

Kevin, ce que tu as dit est exactement ce que je cherchais, si la taille de l'image est inférieure à celle de l'écran, elle est zoomée et centrée, parfait. Merci.

59voto

Kevin Points 191

Si vous voulez un ImageView qui s'adapte à la fois vers le haut et vers le bas tout en gardant le bon rapport d'aspect, ajoutez-le à votre XML :

android:adjustViewBounds="true"
android:scaleType="fitCenter"

Ajoutez ceci à votre code :

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

Il m'a fallu un certain temps pour que cela fonctionne, mais cela semble fonctionner dans les deux cas où l'image est plus petite que la largeur de l'écran et plus grande que la largeur de l'écran, et cela ne met pas l'image en boîte.

1 votes

Pourquoi ne pas simplement utiliser Android:scaleType="centerCrop" ?

0 votes

Cela fonctionne comme un charme, merci. Le type d'échelle dépend de la situation, par exemple, j'avais exactement besoin de cela.

0 votes

C'est une façon un peu barbare de redimensionner la vue. Que se passe-t-il si les limites de la vue changent après avoir défini le bitmap de l'ImageView ? C'est pourquoi cela devrait être fait dans onMeasure(), qui peut être implémenté si vous faites une sous-classe personnalisée de ImageView.

9voto

Samuh Points 16564

Jetez un coup d'œil à ImageView.ScaleType pour contrôler et comprendre la manière dont le redimensionnement s'effectue dans une ImageView . Lorsque l'image est redimensionnée (tout en conservant son rapport hauteur/largeur), il y a de fortes chances pour que la hauteur ou la largeur de l'image devienne plus petite que la taille de l'image. ImageView Les dimensions de l'entreprise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X