Android ImageView: Ajuster la largeur

Je télécharge l’image et la configure comme fond d’écran dynamicment en utilisant Imageview . J’ai essayé ScaleType , pour redimensionner l’image.

Si la hauteur de l’image est supérieure à la largeur, ScaleTypes fitStart , fitEnd et fitCenter ne fonctionnent pas. Android réduit la photo et l’adapte en fonction de la hauteur, mais je vois des espaces vides supplémentaires dans la largeur.

Je veux réduire la photo en fonction de la largeur pour qu’elle corresponde à la largeur et peu importe s’il y a de l’espace supplémentaire dans la hauteur ou si la hauteur est trop longue, ça ira si c’est hors de la vue (si c’est possible?).

ScaleType.XY redimensionne la photo et rentre tout dans ImageView et ne se soucie pas du rapport hauteur / poids de l’image.

  

J’ai fini par utiliser ce code:

  

Assurez-vous de définir l’image à l’aide de src plutôt que d’ backgroundbackground .

android:adjustViewBounds="true" fait le travail!

Cette solution élégante trouvée ici fonctionnera comme un charme pour vous.

Fondamentalement, il vous suffit de créer une petite classe qui étend ImageView et simplement remplacer la méthode 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().getInsortingnsicHeight() / getDrawable().getInsortingnsicWidth(); setMeasuredDimension(width, height); } 

Vous utiliseriez cette image spéciale comme ceci:

  

Il y a 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(); DisplayMesortingcs outMesortingcs = new DisplayMesortingcs(); display.getMesortingcs(outMesortingcs); float scWidth = outMesortingcs.widthPixels; trupImage.getLayoutParams().width = (int) scWidth; trupImage.getLayoutParams().height = (int) (scWidth * 0.6f); 

Où 0,6 est le réglage du rapport (vous pouvez également calculer automatiquement bien sûr si vous connaissez le w & h de l’image).

PS:
Voici le côté XML:

   

Cela fonctionne pour moi.

Créer une classe étend ImageView

  package com.yourdomain.utils; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AtsortingbuteSet; import android.widget.ImageView; public class ResizableImageView extends ImageView { public ResizableImageView(Context context, AtsortingbuteSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Drawable d = getDrawable(); if (d != null) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = (int) Math.ceil((float) width * (float) d.getInsortingnsicHeight() / (float) d.getInsortingnsicWidth()); setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } 

Dans xml, utilisez ce qui suit au lieu de ImageView

   

Je pense que vous ne pouvez pas le faire uniquement avec XML, vous devez redimensionner vous-même, le bitmap

 Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); try { ((ImageView) findViewById(R.id.background)) .setImageBitmap(ShrinkBitmap(width)); } catch (FileNotFoundException e) { e.printStackTrace(); } 

puis

 private Bitmap ShrinkBitmap(int width) throws FileNotFoundException { BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); bmpFactoryOptions.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); int widthRatio = (int) android.util.FloatMath .ceil(bmpFactoryOptions.outWidth / (float) width); bmpFactoryOptions.inSampleSize = widthRatio; if (bmpFactoryOptions.inSampleSize <= 0) bmpFactoryOptions.inSampleSize = 0; bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; bmpFactoryOptions.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); return bitmap; } 

Et la mise en page