Comment dimensionner une Image dans ImageView pour conserver le format d'image

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

si l'image que j'ai mise à ImageView est plus grande que le layout_width , Android va l'échelle, non? Mais que dire de la hauteur? Quand Android balance l'image, gardera-t-il le format d'image?

ce que je découvre, c'est qu'il y a un espace blanc en haut et en bas du ImageView quand Android balance un image qui est plus grande que le ImageView . Est-ce vrai? Si oui, comment puis-je éliminer l'espace blanc?

441
demandé sur MiJyn 2010-03-26 11:41:15

21 réponses

  1. Oui, par défaut Android va réduire votre image pour s'adapter à L'ImageView, en maintenant le rapport d'aspect. Cependant, assurez-vous de configurer L'image à L'ImageView en utilisant android:src="..." plutôt que android:background="..." . src= lui fait échelle de l'image maintenir le rapport d'aspect, mais background= lui fait échelle et fausser l'image pour la faire correspondre exactement à la taille de L'ImageView. (Vous pouvez utiliser un arrière-plan et une source même temps, ce qui peut être utile pour des choses comme afficher un cadre autour de l'image principale, en utilisant juste une ImageView.)

  2. vous devriez aussi voir android:adjustViewBounds pour que L'ImageView se redimensionne pour s'adapter à l'image rééchelonnée. Par exemple, si vous avez une image rectangulaire, dans ce qui serait normalement un carré ImageView, adjustViewBounds=true fera redimensionner l'ImageView rectangulaire. Cela affecte ensuite la façon dont les autres points de vue sont présentés autour de L'ImageView.

    alors comme Samuh a écrit, Vous pouvez changer la façon dont il balance les images par défaut en utilisant le paramètre android:scaleType . D'ailleurs, la façon la plus facile de découvrir comment cela fonctionne aurait été simplement d'expérimenter un peu vous-même! Rappelez-vous juste de regarder les mises en page dans L'émulateur lui-même (ou un téléphone réel) que l'aperçu dans Eclipse est généralement faux.

688
répondu Steve Haley 2016-04-12 16:38:20

voir android:adjustViewBounds .

réglez cela à true si vous voulez que L'ImageView ajuste ses limites pour préserver le rapport d'aspect de son drawable.

254
répondu Gratzi 2015-03-10 12:26:05

à toute autre personne ayant ce problème particulier. Vous avez un ImageView (ou autre View ) que vous voulez avoir une largeur de fill_parent et une hauteur graduée proportionnellement:

ajoutez ces deux attributs à votre ImageView :

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

et régler la" largeur 151920920 "à fill_parent et la hauteur à wrap_content .

aussi, si vous ne voulez pas que votre image soit coupée, essayez ceci:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"
146
répondu Kevin Parker 2014-12-16 23:40:06

si vous voulez un ImageView qui monte et descend tout en gardant le bon format d'image, ajoutez ceci à votre XML:

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

ajouter à 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 obtenir ce fonctionnement, mais cela semble fonctionner dans les cas où l'image est plus petite que la largeur de l'écran et plus grande que la largeur de l'écran, et il ne encadre pas l'image.

47
répondu Kevin 2012-09-02 16:36:22

ci-dessous code travaillant pour scale image as aspect ratio:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);
9
répondu Mukesh Parmar 2014-11-25 14:38:53

cela a fonctionné pour moi:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"
9
répondu Mike6679 2017-07-03 16:08:05

regardez ImageView.ScaleType pour contrôler et comprendre la façon dont le redimensionnement se produit dans un ImageView . Lorsque l'image est redimensionnée (tout en maintenant son format), les chances sont que la hauteur ou la largeur de l'image devient plus petite que ImageView 's dimensions.

7
répondu Samuh 2012-09-02 16:37:24

cela a résolu mon problème

android:adjustViewBounds="true"
android:scaleType="fitXY"
7
répondu shafiq-ur-rehman 2017-04-24 11:49:10

j'ai une image plus petite que l'écran. Pour qu'il soit étiré proportionnellement au max et centré dans la vue, j'ai dû utiliser le code suivant:

<ImageView
    android:id="@+id/my_image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:adjustViewBounds="true"
    android:layout_weight="1"
    android:scaleType="fitCenter" />

a cependant à l'esprit que si vous avez une mise en page relative et que vous avez des éléments définis pour être au-dessus ou au-dessous de L'ImageView, ils seront très probablement superposés par l'image.

4
répondu halxinate 2014-11-25 14:31:11

utilisez ces propriétés dans ImageView pour conserver le rapport d'aspect:

android:adjustViewBounds="true"
android:scaleType="fitXY"

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />
4
répondu Atif Mahmood 2016-05-05 06:29:00

pour tous ceux d'entre vous qui veulent que l'image s'adapte exacte l'imageview avec une mise à l'échelle appropriée et pas d'utilisation de recadrage

imageView.setScaleType(ScaleType.FIT_XY);

où imageView est la vue représentant votre ImageView

3
répondu oneConsciousness 2012-12-10 12:14:31

vous pouvez calculer la largeur de l'écran. Et vous pouvez dimensionner bitmap.

 public static float getScreenWidth(Activity activity) {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        float pxWidth = outMetrics.widthPixels;
        return pxWidth;
    }

calculez la largeur de l'écran et la hauteur de l'image à l'échelle selon la largeur de l'écran.

float screenWidth=getScreenWidth(act)
  float newHeight = screenWidth;
  if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
     newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
  }

après que vous pouvez échelle bitmap.

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);
3
répondu mustafasevgi 2015-03-10 12:36:03

lors de cette programmation, assurez-vous d'appeler les régleurs dans le bon ordre:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
3
répondu lukas 2017-04-06 19:39:21

si vous voulez que votre image occupe le maximum d'espace possible, alors la meilleure option serait

android:layout_weight="1"
android:scaleType="fitCenter"
2
répondu Mohsen Afshin 2012-08-19 15:33:14

essayez d'utiliser android:layout_gravity pour ImageView:

android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"

L'exemple ci-dessus a fonctionné pour moi.

1
répondu ITisha 2013-08-20 13:11:49

j'ai un algorithme pour mettre à l'échelle un bitmap afin de s'adapter aux dimensions du conteneur, en maintenant son format d'image. S'il vous plaît trouver ma solution ici

Espérons que cela aide quelqu'un en bas de la voie!

1
répondu Parth Kapoor 2017-05-23 12:26:38

vous n'avez pas besoin de code java. Il suffit de:

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />

La clé est dans le match parent pour la largeur et la hauteur

1
répondu Romu Dizzy 2017-01-17 02:15:03

j'utilise ceci:

<ImageView
android:id="@+id/logo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:scaleType="centerInside"
android:src="@drawable/logo" />
0
répondu Flavio Capaccio 2013-06-26 16:07:16

Pass your imageview and based on screen height and width you can make it  


    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }

0
répondu 2016-01-04 13:24:44
myImageView.setAdjustViewBounds(true);
-1
répondu Leo 2013-07-19 19:51:46
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));
-3
répondu user2099162 2013-08-24 09:32:41