ImageView填充父宽度或高度,但保持宽高比
我有一个方形图像(虽然这个问题也适用于矩形图像)。 我希望尽可能大地展示图片,如有必要可以展开图片,以填充父母,同时保持高宽比。 图像比ImageView小。 问题是,我无法拉伸图像,并“匹配”ImageView的高度和宽度。
这是我的XML布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dp"> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:adjustViewBounds="true" android:scaleType="fitCenter" android:layout_marginTop="10dp"/> <TextView android:id="@+id/name" android:layout_below="@id/image" android:layout_alignLeft="@id/image" android:layout_marginTop="20dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18dp"/> <TextView android:id="@+id/name2" android:layout_below="@id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="14dp"/> </RelativeLayout>
我已经使用fill_parent
, wrap_content
和多个缩放types的许多组合: fitCenter
, fitStart
, fitEnd
, centerInside
,它们都以正确的高宽比绘制图像,但是没有一个实际缩放图像和ImageView本身 ,导致TextViews被一路推下屏幕,ImageView里面的空白,图像没有缩放或图像被裁剪。
我不能完全确定这个合适的组合。
这些:
android:layout_height="wrap_content" android:scaleType="fitStart" android:adjustViewBounds="true"
应调整图像大小并更改边界的大小以适应新的图像大小。 如果它没有在你的设备上发布你正在使用的图像和你正在testing的设备。
使用此代码: android:scaleType="fitXY"
有关图像缩放的更多细节,请看这篇文章中的动作
概要:
-
center
将图像置于视图中央,但不执行缩放
-
centerCrop
均匀缩放图像(保持图像的高宽比),以使图像的两个尺寸(宽度和高度)等于或大于视图的相应尺寸(减去填充)。 图像然后居中在视图中
-
centerInside
均匀缩放图像(保持图像的宽高比),使图像的两个尺寸(宽度和高度)等于或小于视图的相应尺寸(减去填充)
-
fitCenter
-
fitEnd
-
fitStart
-
fitXY
-
matrix
绘图时使用图像matrix进行缩放
这里更详细的新文章
将此代码与视图布局参数一起用作wrapcontent
机器人:adjustViewBounds = “真”
希望这会起作用。
你有没有试图调整它programmaticaly? 如果计算TextView
的高度,并基于此调整图像的高度和宽度,我认为它工作得很好。
private void adjustImageView() { //Get the display dimensions DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); //TextView name TextView name = (TextView) findViewById(R.id.name); name.setText("your name text goes here"); name.measure(0, 0); //name TextView height int nameH = name.getMeasuredHeight(); //TextView name2 TextView name2 = (TextView) findViewById(R.id.name2); name2.setText("your name2 text goes here"); name2.measure(0, 0); //name2 TextView height int name2H = name2.getMeasuredHeight(); //Original image Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image); //Width/Height ratio of your image float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight(); //Calculate the new width and height of the image to display int imageToShowHeight = metrics.heightPixels - nameH - name2H; int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight); //Adjust the image width and height if bigger than screen if(imageToShowWidth > metrics.widthPixels) { imageToShowWidth = metrics.widthPixels; imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio); } //Create the new image to be shown using the new dimensions Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true); //Show the image in the ImageView ImageView image = (ImageView) findViewById(R.id.image); image.setImageBitmap(imageToShow); }
我有同样的问题,android:adjustViewBounds不做它的工作,并在图像的顶部填充。 进入一个相对宽度和高度都有match_parent值的布局,我有:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/transparent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitStart" android:adjustViewBounds="true" ...
我改变了相对布局线性布局与宽度和高度的wrap_content值现在可以:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"
这个XML代码将工作! 如果您指定应用宽度始终与窗口相同,则android:adjustViewBounds="true"
将根据图像比例设置高度。
<ImageView android:adjustViewBounds="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/screen"/>
在imageview中设置android:layout_height="wrap_content"
。 要创build宽度等于屏幕宽度的图像,并根据宽高比按比例设置高度,请执行以下操作。 在这里我提到如何将图像从url加载到imageview。
Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { // creating the image that maintain aspect ratio with width of image is set to screenwidth. int width = imageView.getMeasuredWidth(); int diw = resource.getWidth(); if (diw > 0) { int height = 0; height = width * resource.getHeight() / diw; resource = Bitmap.createScaledBitmap(resource, width, height, false); } imageView.setImageBitmap(resource); } });
希望这可以帮助。