87 votes

Android ImageView : Fit Width

Je télécharge l'image et la configure comme fond d'écran de manière dynamique en utilisant Imageview . J'ai essayé ScaleType pour mettre l'image à l'échelle.

Si la hauteur de l'image est supérieure à la largeur, alors ScaleTypes fitStart , fitEnd y fitCenter ne fonctionnent pas. Android réduit l'échelle de la photo et l'ajuste en fonction de la hauteur, mais je vois un espace vide supplémentaire qui fait partie de la largeur.

Je veux réduire l'échelle de la photo en fonction de la largeur pour qu'elle s'adapte à la largeur et je ne me soucie pas de savoir s'il y a un espace vide supplémentaire faisant partie de la hauteur ou si la hauteur est trop longue, c'est bon si elle sort de la vue (si c'est possible ?).

ScaleType.XY de mettre la photo à l'échelle et de faire rentrer le tout dans le ImageView et ne se soucie pas du rapport taille/poids de l'image.

<ImageView 
                android:id="@+id/background"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:adjustViewBounds="true"
                android:scaleType="fitStart"
            />

207voto

Sharj Points 2398

J'ai fini par utiliser ce code :

<ImageView 
                android:id="@+id/background"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:adjustViewBounds="true"
                android:scaleType="centerCrop"
                android:src="@drawable/name"
            />

Assurez-vous de définir l'image en utilisant src au lieu de background .

78voto

ViliusK Points 1257

android:adjustViewBounds="true" fait le travail !

14voto

Michel-F. Portzert Points 1209

Cette solution élégante a permis de trouver ici fonctionnera comme un charme pour vous.

En gros, il suffit de créer une petite classe qui prolonge ImageView et simplement remplacer le onMeasure pour ajuster la largeur et la hauteur comme vous le souhaitez. Ici, il s'adapte à la largeur en utilisant :

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
    setMeasuredDimension(width, height);
}

Vous utiliseriez ce spécial ImageView comme ça :

<your.activity.package.AspectRatioImageView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_vertical"
    android:src="@drawable/test" />

9voto

Dan Harvey Points 383

Il existe une méthode simple si vous voulez simplement remplir la largeur de l'écran et avoir une hauteur proportionnelle (et connaître le ratio de l'image), vous pouvez le faire dans OnCreate() :

setContentView(R.layout.truppview_activity);
trupImage = (ImageView) findViewById(R.id.trupImage);

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
float scWidth = outMetrics.widthPixels;
trupImage.getLayoutParams().width = (int) scWidth;
trupImage.getLayoutParams().height = (int) (scWidth * 0.6f);

Où 0.6 est l'ajustement du ratio (vous pouvez aussi le calculer automatiquement si vous connaissez le w & h de l'image).

PS :
Voici le côté XML :

  <ImageView
        android:id="@+id/trupImage"
        android:layout_width="match_parent"
        android:background="@color/orange"
        android:layout_height="match_parent" 
        android:adjustViewBounds="true" 
        android:scaleType="fitCenter" />

8voto

SK. Fuad Points 123

Si vous voulez adapter l'image à l'ensemble du bloc parent
cela va étirer l'image

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY" 

Et si vous voulez adapter l'image entière du parent avec le ratio original de l'image
cela va rogner une partie de l'image

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"

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