如何在ImageView中缩放图像以保持宽高比
在Android中,我将ImageView
的layout_width
定义为fill_parent
(占用了手机的全部宽度)。
如果我放入ImageView
的图片大于layout_width
,Android会缩放它,对不对? 但是身高呢? 当Android缩放图像时,它会保持高宽比吗?
我发现当Android缩放大于ImageView
的图像时, ImageView
的顶部和底部会有一些空白。 真的吗? 如果是的话,我怎样才能消除这个空白?
-
是的,默认情况下,Android会缩放图像以适应ImageView,保持纵横比。 但是,请确保您使用
android:src="..."
而不是android:background="..."
将图像设置为ImageView。src=
使图像保持纵横比缩放,但是background=
使图像缩放并扭曲图像,使其与ImageView的大小完全吻合。 (但是,您可以同时使用背景和源,对于像在主图像周围显示框架那样使用一个ImageView,这可能很有用。) -
您还应该看到
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));