Dans Android, j'ai défini un layout_width
de ImageView
comme étant fill_parent
(qui occupe toute la largeur du téléphone).
Si l'image que j'ai mise à ImageView
est plus grande que le layout_width
, Android la redimensionnera, n'est-ce pas? Mais qu'en est-il de la hauteur? Lorsque Android redimensionne l'image, conservera-t-il le rapport d'aspect?
Ce que j’apprends, c’est qu’il ya des espaces en haut et en bas de la ImageView
lorsque Android redimensionne une image plus grande que la ImageView
. Est-ce vrai? Si oui, comment puis-je éliminer cet espace blanc?
Oui, par défaut, Android réduira votre image pour l'adapter à ImageView, tout en maintenant les proportions. Cependant, assurez-vous de définir l'image sur ImageView en utilisant Android:src="..."
plutôt que Android:background="..."
. src=
permet de redimensionner l’image en conservant les proportions, mais background=
de la redimensionner et de la déformer pour l’adapter exactement à la taille de la vue. (Vous pouvez cependant utiliser un arrière-plan et une source en même temps, ce qui peut être utile pour afficher un cadre autour de l'image principale, à l'aide d'un seul ImageView.)
Vous devriez également voir Android:adjustViewBounds
pour que ImageView se redimensionne lui-même pour s’adapter à l’image redimensionnée. Par exemple, si vous avez une image rectangulaire dans ce qui serait normalement un carré ImageView, adjustViewBounds = true le redimensionnera également. Cela affecte ensuite la manière dont les autres vues sont disposées autour de la vue Image.
Ensuite, comme Samuh l’a écrit, vous pouvez modifier la façon dont il redimensionne les images par défaut à l’aide du paramètre Android:scaleType
. En passant, le moyen le plus simple de découvrir comment cela fonctionne aurait tout simplement été d’expérimenter vous-même! N'oubliez pas de regarder les dispositions de l'émulateur lui-même (ou d'un téléphone réel), car la prévisualisation dans Eclipse est généralement fausse.
Voir Android:adjustViewBounds
.
Définissez-la sur true si vous souhaitez que ImageView ajuste ses limites pour conserver le rapport de format de son dessin.
À quiconque ayant ce problème particulier. Vous avez une ImageView
(ou autre View
) pour laquelle vous voulez une largeur de fill_parent
et une hauteur proportionnellement
Ajoutez ces deux attributs à votre ImageView
:
Android:adjustViewBounds="true"
Android:scaleType="centerCrop"
Et définissez la largeur ImageView
sur fill_parent
et la hauteur sur wrap_content
.
Aussi, si vous ne voulez pas que votre image soit recadrée, essayez ceci:
Android:adjustViewBounds="true"
Android:layout_centerInParent="true"
Si vous voulez une ImageView
qui puisse être agrandie et réduite tout en conservant les proportions correctes, ajoutez ceci à votre XML:
Android:adjustViewBounds="true"
Android:scaleType="fitCenter"
Ajoutez ceci à 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);
Cela m'a pris un certain temps pour que cela fonctionne, 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 cela ne met pas l'image en boîte.
Cela a fonctionné pour moi:
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:maxWidth="39dip"
Android:scaleType="centerCrop"
Android:adjustViewBounds ="true"
Code ci-dessous Travailler pour une image à l’échelle en tant que rapport de format:
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);
cela a résolu mon problème
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
Jetez un coup d’œil à ImageView.ScaleType pour contrôler et comprendre la façon dont le redimensionnement se produit dans une ImageView
. Lorsque l'image est redimensionnée (tout en conservant son format), il est probable que la hauteur ou la largeur de l'image devienne inférieure aux dimensions de ImageView
.
Utilisez ces propriétés dans ImageView pour conserver les proportions:
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
/>
J'ai une image plus petite que l'écran. Pour qu'il soit étiré proportionnellement au maximum et centré dans la vue, je devais 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" />
Sachez toutefois que si vous avez une disposition relative et que certains éléments sont placés au-dessus ou au-dessous du ImageView, ils seront probablement recouverts par l'image.
Pour ceux d'entre vous qui veulent que l'image corresponde exactement à la visualisation d'image avec une mise à l'échelle appropriée et aucune utilisation de recadrage
imageView.setScaleType(ScaleType.FIT_XY);
où imageView est la vue représentant votre ImageView
Vous pouvez calculer la largeur de l'écran. Et vous pouvez mettre à l'échelle 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;
}
calculer la largeur de l'écran et la hauteur de l'image redimensionnée par 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 vous pouvez mettre à l'échelle bitmap.
Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);
Lorsque vous effectuez cette opération par programme, veillez à appeler les setters dans le bon ordre:
imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
Si vous voulez que votre image occupe le maximum d’espace possible, alors la meilleure option serait
Android:layout_weight="1"
Android:scaleType="fitCenter"
J'ai un algorithme pour redimensionner un bitmap afin d'adapter au mieux les dimensions du conteneur tout en conservant son rapport de format. S'il vous plaît trouver ma solution ici
J'espère que cela aide quelqu'un dans la voie!
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.
Vous n'avez pas besoin de code Java. Vous devez juste:
<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="centerCrop" />
La clé est dans le parent du match pour la largeur et la hauteur
Vous pouvez redimensionner une image qui réduira également la taille de votre image . Il existe une bibliothèque pour cette application, vous pouvez la télécharger et l’utiliser . https://github.com/niraj124124/Images-Files-scale -and-compress.git
Comment utiliser 1) Importez le compresseur-v1.0. jar à votre projet . 2) Ajoutez l'exemple de code ci-dessous pour tester . ResizeLimiter resize = ImageResizer.build (); resize.scale ("inputImagePath", "outputImagePath", imageWidth, imageHeight); Plusieurs autres méthodes existent selon vos besoins.
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" />
Si la qualité de l’image diminue en: Utilisation
Android:adjustViewBounds="true"
au lieu de
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
Passez votre ImageView et basé sur la hauteur et la largeur de l'écran, vous pouvez le faire
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);
}
en cas d'utilisation de cardview
pour arrondir imageview
et de Android:layout_height
fixe pour en-tête, cela m'a permis de charger l'image avec Glide
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="220dp"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
>
<Android.support.v7.widget.CardView
Android:id="@+id/card_view"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center|top"
card_view:cardBackgroundColor="@color/colorPrimary"
card_view:cardCornerRadius="10dp"
card_view:cardElevation="10dp"
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true">
<ImageView
Android:adjustViewBounds="true"
Android:maxHeight="220dp"
Android:id="@+id/iv_full"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:scaleType="fitCenter"/>
</Android.support.v7.widget.CardView>
</FrameLayout>
Voici comment cela a fonctionné pour moi dans ConstraintLayout:
<ImageView
Android:id="@+id/myImg"
Android:layout_width="300dp"
Android:layout_height="300dp"
Android:scaleType="fitCenter"
Android:adjustViewBounds="true"/>
Puis dans le code, je définis le drawable comme:
ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));
Cela correspond parfaitement à l'image en fonction de son rapport de format et le garde au centre.