在 Android 中,我定义了一个ImageView
's layout_width
(fill_parent
它占据了手机的整个宽度)。
如果我放置的图像ImageView
大于layout_width
,Android 会缩放它,对吗?但是身高呢?当Android缩放图像时,它会保持纵横比吗?
我发现ImageView
当 Android 缩放比ImageView
. 真的吗?如果是,我怎样才能消除那个空白?
在 Android 中,我定义了一个ImageView
's layout_width
(fill_parent
它占据了手机的整个宽度)。
如果我放置的图像ImageView
大于layout_width
,Android 会缩放它,对吗?但是身高呢?当Android缩放图像时,它会保持纵横比吗?
我发现ImageView
当 Android 缩放比ImageView
. 真的吗?如果是,我怎样才能消除那个空白?
是的,默认情况下,Android 会缩小您的图像以适应 ImageView,并保持纵横比。但是,请确保您将图像设置为 ImageView 使用android:src="..."
而不是android:background="..."
. src=
使其缩放图像保持纵横比,但background=
使其缩放和扭曲图像以使其完全适合 ImageView 的大小。(不过,您可以同时使用背景和源,这对于仅使用一个 ImageView 在主图像周围显示框架等非常有用。)
您还应该看到android:adjustViewBounds
让 ImageView 调整自身大小以适应重新缩放的图像。例如,如果您在通常是方形的 ImageView 中有一个矩形图像,则 adjustViewBounds=true 将使其也将 ImageView 的大小调整为矩形。这会影响其他视图在 ImageView 周围的布局方式。
然后正如 Samuh 所写,您可以使用参数更改默认缩放图像的方式android:scaleType
。顺便说一句,发现它是如何工作的最简单的方法就是自己尝试一下!请记住查看模拟器本身(或实际手机)中的布局,因为 Eclipse 中的预览通常是错误的。
如果您希望 ImageView 调整其边界以保持其可绘制对象的纵横比,请将其设置为 true。
对于其他有此特定问题的人。您有一个ImageView
您希望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);
我花了一段时间才开始工作,但这似乎适用于图像小于屏幕宽度和大于屏幕宽度的情况,并且它不会对图像进行装箱。
这对我有用:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"
这就是它在 ConstraintLayout 中为我工作的方式:
<ImageView
android:id="@+id/myImg"
android:layout_width="300dp"
android:layout_height="300dp"
android:scaleType="fitCenter"
android:adjustViewBounds="true"/>
然后在代码中,我将drawable设置为:
ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));
这会根据图像的纵横比很好地拟合图像并将其保持在中心。
这解决了我的问题
android:adjustViewBounds="true"
android:scaleType="fitXY"
查看ImageView.ScaleType以控制和理解在ImageView
. 当调整图像大小(同时保持其纵横比)时,图像的高度或宽度可能会小于ImageView
的尺寸。
下面的代码适用于比例图像作为纵横比:
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
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,则它们很可能会被图像重叠。
在 ImageView 中使用这些属性来保持纵横比:
android:adjustViewBounds="true"
android:scaleType="fitXY"
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"
/>
如果图像质量下降:使用
android:adjustViewBounds="true"
代替
android:adjustViewBounds="true"
android:scaleType="fitXY"
对于任何希望图像以适当的缩放比例和不使用裁剪的方式完全适合图像视图的人
imageView.setScaleType(ScaleType.FIT_XY);
其中 imageView 是代表您的 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.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
如果您希望您的图像占据最大可能的空间,那么最好的选择是
android:layout_weight="1"
android:scaleType="fitCenter"
哟不需要任何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" />
尝试使用android:layout_gravity
ImageView:
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"
上面的例子对我有用。
我有一个算法来缩放位图以最适合容器尺寸,保持其纵横比。请在这里找到我的解决方案
希望这可以帮助别人!
通过您的 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);
}
以编程方式将纵横比应用于 Imageview:
aspectRatio = imageWidth/imageHeight
ratioOfWidth = imageWidth/maxWidth
ratioOfHeight = imageHeight/maxHeight
if(ratioOfWidth > ratioOfHeight){
imageWidth = maxWidth
imageHeight = imageWidth/aspectRatio
} else if(ratioOfHeight > ratioOfWidth){
imageHeight = maxHeight
imageWidth = imageHeight * aspectRatio
}
之后,您可以使用缩放位图来图像视图
Bitmap scaledBitmap= Bitmap.createScaledBitmap(bitmap, (int) imageWidth , (int) imageHeight , true);
如果使用cardview
舍入imageview
和固定android:layout_height
的标题,这对我加载图像有用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>
您可以缩放图像,这也将减小图像的大小。它有一个库,您可以下载和使用它。 https://github.com/niraj124124/Images-Files-scale-and-compress.git
使用方法 1)导入压缩器-v1.0。jar 到你的项目。2)添加以下示例代码进行测试。ResizeLimiter resize = ImageResizer.build(); resize.scale("inputImagePath", "outputImagePath",imageWidth, imageHeight); 根据您的要求,还有更多方法
快速回答:
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center"
android:src="@drawable/yourImage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));