Android ImageView ajustant la hauteur et la largeur d’adaptation du parent

Mise à jour : j’ai résolu ce problème en utilisant la méthode décrite dans cette réponse

Je suis un peu coincé avec ce problème, qui, je pense, devrait être assez simple.

Donc, mon application télécharge une image et affiche l’image bitmap dans un ImageView, un élément enfant d’un RelativeLayout. Je voudrais que l’ImageView corresponde à la largeur parent et que sa taille soit adaptée pour conserver les proportions.

Voici mon XML:

     

Et le code:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); RelativeLayout banner = (RelativeLayout) findViewById(R.id.banner); ImageView imgV = new ImageView(this); imgV.setScaleType(ImageView.ScaleType.CENTER_CROP); // I sortinged all the scale types : CENTER_INSIDE : same effect, FIT_CENTER : same effect... imgV.setBackgroundColor(0x00FFFF00); imgV.setAdjustViewBounds(Color.BLUE); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); banner.addView(imgV,params); // Some code downloading the image stream bitmap = BitmapFactory.decodeStream(stream); imgV.setImageBitmap(bitmap); } 

Désiré:

Résultat désiré

Résultat :

Résultat actuel

Merci à @Julien et @js. Voici une solution complète d’ImageView qui va étirer le rapport hauteur / largeur d’images bitmap même si le bitmap est plus petit qu’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){ // ceil not round - avoid thin vertical gaps along the left/right edges 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); } } } 

Vous pouvez utiliser cette classe dans vos mises en page XML au lieu de ImageView.

  

Vous recherchez probablement android:adjustViewBounds="true" dans xml ou imageView.setAdjustViewBounds(true) dans Java.

Comme je l’ai mentionné dans un commentaire, j’ai sous-classé ImageView. J’ai trouvé mon code, c’est parti:

  protected class ResizableImageView extends ImageView { private Bitmap mBitmap; // Constructor public ResizableImageView(Context context) { super(context); } // Overriden methods @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if(mBitmap != null) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = width * mBitmap.getHeight() / mBitmap.getWidth(); setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } @Override public void setImageBitmap(Bitmap bitmap) { mBitmap = bitmap; super.setImageBitmap(bitmap); } } 

Je pense que vous devriez changer votre largeur imgV à “match_parent”

Vous devez remplacer le type d’échelle par imgV.setScaleType (ImageView.ScaleType.CENTER_INSIDE);

J’ai légèrement modifié la solution de @Seraphim S pour tenir compte des cas où l’image peut être large et les limites de la vue également larges (par exemple, en faisant pivoter l’appareil en mode paysage).

 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 = MeasureSpec.getSize(heightMeasureSpec); if (width >= height) { width = (int) Math.ceil((float) height * (float) d.getInsortingnsicWidth() / (float) d.getInsortingnsicHeight()); } else { height = (int) Math.ceil((float) width * (float) d.getInsortingnsicHeight() / (float) d.getInsortingnsicWidth()); } setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } }