如何在ImageView中缩放图像以保持宽高比

在Android中,我将ImageViewlayout_width定义为fill_parent (占用了手机的全部宽度)。

如果我放入ImageView的图片大于layout_width ,Android会缩放它,对不对? 但是身高呢? 当Android缩放图像时,它会保持高宽比吗?

我发现当Android缩放大于ImageView的图像时, ImageView的顶部和底部会有一些空白。 真的吗? 如果是的话,我怎样才能消除这个空白?

  1. 是的,默认情况下,Android会缩放图像以适应ImageView,保持纵横比。 但是,请确保您使用android:src="..."而不是android:background="..."将图像设置为ImageView。 src=使图像保持纵横比缩放,但是background=使图像缩放扭曲图像,使其与ImageView的大小完全吻合。 (但是,您可以同时使用背景和源,对于像在主图像周围显示框架那样使用一个ImageView,这可能很有用。)

  2. 您还应该看到android:adjustViewBounds ,使ImageView调整自己以适应重新缩放的图像。 例如,如果在通常为正方形的ImageView中有一个矩形图像,则adjustViewBounds = true将使其将ImageView重新调整为矩形。 这影响了ImageView周围其他视图的布局。

    然后,如Samuh写道,你可以改变默认缩放图像使用android:scaleType参数的方式。 顺便说一下,最简单的方法来发现这是如何工作的只是试验一下你自己! 只要记住看看模拟器本身(或实际的电话)的布局,因为在Eclipse中的预览通常是错误的。

请参阅android:adjustViewBounds

如果您希望ImageView调整其边界以保持其可绘制的高宽比,请将其设置为true。

对任何人有这个特定的问题。 你有一个ImageView (或其他View ),你想要有一个fill_parent宽度和高度按比例缩放:

将这两个属性添加到您的ImageView

 android:adjustViewBounds="true" android:scaleType="centerCrop" 

然后将ImageView宽度设置为fill_parent ,将高度设置为wrap_content

另外,如果你不想让你的图像被裁剪,试试这个:

  android:adjustViewBounds="true" android:layout_centerInParent="true" 

如果您希望在保持适当的宽高比的同时扩大和缩小ImageView ,请将其添加到XML中:

 android:adjustViewBounds="true" android:scaleType="fitCenter" 

添加到您的代码:

 // 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); 

我花了一段时间才得到这个工作,但是这似乎适用于图像小于屏幕宽度和大于屏幕宽度的情况,并且它不包含图像。

下面的代码工作的比例图像作为纵横比:

 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); 

看看ImageView.ScaleType来控制和理解在ImageView中resize的方式。 当图像被resize时(同时保持宽高比),图像的高度或宽度可能会比ImageView的尺寸小。

这对我工作:

 android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxWidth="39dip" android:scaleType="centerCrop" android:adjustViewBounds ="true" 

我有一个比屏幕小的图像。 为了让它在视图中按比例拉伸,并且居中,我不得不使用下面的代码:

 <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" /> 

请记住,如果您有一个相对的布局,并有一些元素设置为在ImageView上方或下方,它们将很可能与图像重叠。

你可以计算屏幕宽度。 你可以缩放位图。

  public static float getScreenWidth(Activity activity) { Display display = activity.getWindowManager().getDefaultDisplay(); DisplayMetrics outMetrics = new DisplayMetrics(); display.getMetrics(outMetrics); float pxWidth = outMetrics.widthPixels; return pxWidth; } 

通过屏幕宽度计算屏幕宽度和缩放的图像高度。

 float screenWidth=getScreenWidth(act) float newHeight = screenWidth; if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) { newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth(); } 

您可以缩放位图后。

 Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true); 

在ImageView中使用这些属性来保持宽高比:

 android:adjustViewBounds="true" android:scaleType="fitXY" <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY" /> 

以编程方式执行此操作时,请务必按照正确的顺序调用setter:

 imageView.setAdjustViewBounds(true) imageView.setScaleType(ImageView.ScaleType.CENTER_CROP) 

如果你想让自己的形象占据最大可能的空间,那么最好的select是

 android:layout_weight="1" android:scaleType="fitCenter" 

对于任何想要图像的人,都可以通过适当的缩放比例来适应imageview,而不需要裁剪

 imageView.setScaleType(ScaleType.FIT_XY); 

imageView是代表ImageView的视图

这解决了我的问题

 android:adjustViewBounds="true" android:scaleType="fitXY" 

尝试使用android:layout_gravity for ImageView:

 android:layout_width="wrap_content" android:layout_height="0dp" android:layout_gravity="center_vertical|center_horizontal" android:layout_weight="1" 

上面的例子为我工作。

我有一个algorithm来缩放位图,以适应容器的尺寸,保持其纵横比。 请在这里find我的解决scheme

希望这可以帮助一些人下车!

哟不需要任何Java代码。 你只需要:

 <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop" /> 

关键在于宽度和高度的匹配父项

我使用这个:

 <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" /> 

 传递你的imageview,并根据屏幕的高度和宽度,你可以做到这一点  

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); }

 myImageView.setAdjustViewBounds(true); 
 imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false)); 
Interesting Posts