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?
21 réponses
-
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 queandroid:background="..."
.src=
lui fait échelle de l'image maintenir le rapport d'aspect, maisbackground=
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.) -
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.
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.
à 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"
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.
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);
cela a fonctionné pour moi:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"
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.
cela a résolu mon problème
android:adjustViewBounds="true"
android:scaleType="fitXY"
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.
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"
/>
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
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);
lors de cette programmation, assurez-vous d'appeler les régleurs 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"
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.
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!
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
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" />
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);
}
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));