ImageView的填充父的宽度或高度,而是保持纵横比(ImageView fills parent

2019-06-24 23:46发布

我有一个方形的图像(尽管这个问题也适用于矩形图像)。 我想要显示的图像尽可能的大,拉伸他们,如果有必要,以填补他们的父母,同时仍然保持纵横比。 该图像是比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_parentwrap_content多scaleTypes: fitCenterfitStartfitEndcenterInside ,他们都画在正确的纵横比的图像,但它们都没有实际缩放图像UP和ImageView的本身 ,导致无论是在TextViews被推一路下滑到屏幕中,ImageView的内部空白,图像不进行缩放,或者图像裁剪。

我不能完全弄清楚这个正确的组合。

Answer 1:

这些:

android:layout_height="wrap_content"
android:scaleType="fitStart"
android:adjustViewBounds="true"

要调整图像的大小,改变边界的大小以适应新的图像大小。 如果不这样做,你的设备上张贴您使用的,哪些是你在测试设备上的图像。



Answer 2:

使用此代码: android:scaleType="fitXY"

有关图像缩放的详细信息,看看这是什么文章中示意这里

摘要:

  • center

居中图像中的观点,但执行不结垢

  • centerCrop

缩放图像均匀(保持图像的纵横比),以使图像的两个尺寸(宽度和高度)会比图(减去填充)的对应尺寸等于或更大。 该图像然后在视图中为中心

  • centerInside

缩放图像均匀(保持图像的纵横比),以使图像的两个尺寸(宽度和高度)会比图(减去填充)的对应尺寸等于或小于

  • fitCenter

  • fitEnd

  • fitStart

  • fitXY

  • matrix

绘制时缩放使用图像矩阵

更多的细节在这里新文章



Answer 3:

使用此代码视图布局参数wrapcontent

机器人:adjustViewBounds = “真”

希望这会工作。



Answer 4:

这个XML代码将工作! 如果您要指定您的应用宽度总是一样的窗口,那么android:adjustViewBounds="true"将设置高度各自对图像的口粮。

        <ImageView
        android:adjustViewBounds="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/screen"/>


Answer 5:

我有同样的问题,安卓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"


Answer 6:

你有没有尝试programmaticaly调整呢? 我认为它的作品真的很好,如果你计算你的高度TextView S和调整基于此图像的高度和宽度。

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


Answer 7:

设置android:layout_height="wrap_content"在ImageView的。 为了生成图像与宽度等于屏幕宽度和高度根据方面比成比例地设定,执行以下操作。 在这里我提到如何从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);
                    }
                });

希望这可以帮助。



文章来源: ImageView fills parent's width OR height, but maintains aspect ratio