J'ai une image carrée (même si ce problème s'applique également aux images rectangulaires). Je souhaite afficher l'image aussi grande que possible, en l'étirant si nécessaire, pour remplir leurs parents, tout en maintenant les proportions. L'image est plus petite que l'image. Le problème est que je ne peux pas étirer l'image et "faire correspondre" la hauteur et la largeur de ImageView.
Ceci est mon fichier de mise en page XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:padding="10dp">
<ImageView Android:id="@+id/image"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:adjustViewBounds="true"
Android:scaleType="fitCenter"
Android:layout_marginTop="10dp"/>
<TextView Android:id="@+id/name"
Android:layout_below="@id/image"
Android:layout_alignLeft="@id/image"
Android:layout_marginTop="20dp"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="18dp"/>
<TextView Android:id="@+id/name2"
Android:layout_below="@id/name"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="14dp"/>
</RelativeLayout>
J'ai utilisé de nombreuses combinaisons de fill_parent
, wrap_content
avec plusieurs scaleTypes: fitCenter
, fitStart
, fitEnd
, centerInside
et elles dessinent toutes les images dans le bon format, mais aucune d'entre elles n'agrandit réellement les images et ImageView lui-même, les affichages TextViews étant complètement supprimés de l'écran, des espaces vides dans ImageView, une image non redimensionnée ou une image rognée.
Je ne peux pas vraiment comprendre la bonne combinaison pour cela.
Celles-ci:
Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Android:adjustViewBounds="true"
devrait redimensionner l'image et changer la taille des limites pour s'adapter à la nouvelle taille de l'image. Si cela ne se produit pas sur votre appareil, postez l'image que vous utilisez et sur quel appareil vous testez.
Utilisez ce code: Android:scaleType="fitXY"
Pour plus de détails sur la mise à l'échelle des images, regardez ce qui est proposé dans cet article ici
Résumé:
center
Centrer l'image dans la vue, mais ne pas mettre à l'échelle
centerCrop
Redimensionnez l'image de manière uniforme (conservez le format de l'image) de sorte que les deux dimensions (largeur et hauteur) de l'image soient égales ou supérieures à la dimension correspondante de la vue (moins le remplissage). L'image est ensuite centrée dans la vue
centerInside
Redimensionne l'image uniformément (conserve le rapport de format de l'image) de sorte que les deux dimensions (largeur et hauteur) de l'image soient égales ou inférieures à la dimension correspondante de la vue (moins le remplissage).
fitCenter
fitEnd
fitStart
fitXY
matrix
Échelle en utilisant la matrice d'image lors du dessin
plus de détails ici nouvel article
Utilisez ce code avec les paramètres de présentation de la vue comme wrap_content
Android: adjustViewBounds = "true"
J'espère que cela fonctionnera.
Ce code xml fonctionnera! Si vous indiquez que la largeur de vos applications est toujours identique à celle de la fenêtre, le Android:adjustViewBounds="true"
définit la hauteur en fonction du rapport de l'image.
<ImageView
Android:adjustViewBounds="true"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:src="@drawable/screen"/>
J'ai eu le même problème, Android: AdjustViewBounds ne fait pas son travail et ayant un remplissage en haut de l'image. Dans une mise en page relative qui avait des valeurs match_parent pour la largeur et la hauteur, j'avais:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical" Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/transparent">
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Android:adjustViewBounds="true" ...
J'ai changé la disposition relative en une disposition linéaire avec les valeurs wrap_content pour la largeur et la hauteur et maintenant c'est correct
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Avez-vous essayé de l'ajuster par programmation? Je pense que cela fonctionne très bien si vous calculez la hauteur de votre TextView
s et ajustez la hauteur et la largeur de l'image en fonction de cela.
private void adjustImageView()
{
//Get the display dimensions
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//TextView name
TextView name = (TextView) findViewById(R.id.name);
name.setText("your name text goes here");
name.measure(0, 0);
//name TextView height
int nameH = name.getMeasuredHeight();
//TextView name2
TextView name2 = (TextView) findViewById(R.id.name2);
name2.setText("your name2 text goes here");
name2.measure(0, 0);
//name2 TextView height
int name2H = name2.getMeasuredHeight();
//Original image
Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image);
//Width/Height ratio of your image
float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight();
//Calculate the new width and height of the image to display
int imageToShowHeight = metrics.heightPixels - nameH - name2H;
int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight);
//Adjust the image width and height if bigger than screen
if(imageToShowWidth > metrics.widthPixels)
{
imageToShowWidth = metrics.widthPixels;
imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
}
//Create the new image to be shown using the new dimensions
Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true);
//Show the image in the ImageView
ImageView image = (ImageView) findViewById(R.id.image);
image.setImageBitmap(imageToShow);
}
Définissez Android:layout_height="wrap_content"
dans imageview . Pour créer une image avec une largeur égale à la largeur de l'écran et une hauteur proportionnellement définie en fonction du rapport de format, procédez comme suit. Ici, je mentionne comment charger image à imageview à partir de l’URL.
Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
// creating the image that maintain aspect ratio with width of image is set to screenwidth.
int width = imageView.getMeasuredWidth();
int diw = resource.getWidth();
if (diw > 0) {
int height = 0;
height = width * resource.getHeight() / diw;
resource = Bitmap.createScaledBitmap(resource, width, height, false);
}
imageView.setImageBitmap(resource);
}
});
J'espère que cela t'aides.