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 с несколькими типами:fitCenter, fitStart, fitEnd, centerInsideи все они рисуют изображения в правильном соотношении сторон, ноnone of them actually scale the images up and the ImageView itselfВ результате текстовые представления либо выталкиваются полностью за пределы экрана, либо остаются пустые места внутри ImageView, изображение не масштабируется, либо изображение обрезается.

Я не могу придумать правильную комбинацию для этого.

 garbagecollector31 мая 2012 г., 21:06
@slybloty У меня есть несколько изображений, но я показываю одно изображение. Я должен был сформулировать этот вопрос лучше. Это отображение одного изображения.
 Sufian30 апр. 2013 г., 14:17
Ты пыталсяandroid:scaleType="fitXY"? Он растягивает изображение, чтобы соответствовать ширине и высоте, которые вы назначаете (то есть он не учитывает соотношение сторон).
 slybloty31 мая 2012 г., 16:08
У вас есть только одно изображение или несколько? Вы думали об использованииScrollView? Высота вашего изображения больше, чем высота экрана? Если да, то как вы хотите, чтобы ваш макет выглядел? ВашTextView nameЭто должно быть слева или снизу от изображения? Если вы хотите, чтобы все 3 вида соответствовали вашему экрану, все они должны иметьandroid:layout_height="wrap_content".
 garbagecollector31 мая 2012 г., 04:00
@Tim: я уже установилadjustViewBounds=true, Это как-то не изменило границы ImageView.
 FoamyGuy31 мая 2012 г., 03:53
попробуйте ответ, приведенный здесь:stackoverflow.com/questions/5355130/…

Ответы на вопрос(7)

Этот код XML будет работать! Если вы указываете, что ширина ваших приложений всегда совпадает с шириной окна, тоandroid:adjustViewBounds="true" установит высоту, соответствующую соотношению изображения.

        <ImageView
        android:adjustViewBounds="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/screen"/>
 30 авг. 2018 г., 10:21
Пусть бог переполнения стека благословит вашу душу. Я потратил на это целый день, отказавшись от узкого изображения или изображения с белыми сторонами. Вернулся сегодня утром и подумал "Эй, дай мне погуглить" @garbagecollector должен действительно принять этот ответ !!

У меня была та же проблема, 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"
 08 нояб. 2018 г., 11:48
@ MatanKoby, счастливого кодирования! В Android много секретов и подземелий.
 08 нояб. 2018 г., 11:42
Мой ImageView: & lt; ImageView android: id = & quot; @ + id / IV_InformationPic & quot; Android: layout_width = & Quot; wrap_content & Quot; Android: layout_height = & Quot; 300dp & Quot; Android: adjustViewBounds = & Quot; истинно & Quot; / & GT; & Quot; Находясь внутри Относительного макета, ImageView будет правильно обрабатывать его высоту, но у него есть дополнительные отступы слева и справа, почему-то. После прочтения этого ответа и комментария @ CoolMind я попытался изменить его на LinearLayout и poof, у ImageView больше нет боковых отступов. Я хотел бы понять это вуду.
 05 авг. 2016 г., 23:25
После многих часов поиска я также изменил RelativeLayout на LinearLayout. Но в моем случае ImageView не было показано.

Задаватьandroid:layout_height="wrap_content" в изображении. Чтобы создать изображение, ширина которого равна ширине экрана, а высота пропорционально установлена в соответствии с соотношением сторон, выполните следующие действия. Здесь я упоминаю, как загрузить изображение в imageview из URL.

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

Надеюсь это поможет.

Вы пытались настроить это программно? Я думаю, что это работает очень хорошо, если вы рассчитываете высоту вашегоTextViews и отрегулируйте высоту и ширину изображения на основе этого.

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:layout_height="wrap_content"
android:scaleType="fitStart"
android:adjustViewBounds="true"

следует изменить размер изображения и изменить размер границ в соответствии с новым размером изображения. Если этого не происходит, отправьте изображение, которое вы используете, и укажите, на каком устройстве вы тестируете.

 27 июн. 2014 г., 13:05
FitXY работает вместо fitStart, в противном случае это хорошо, спасибо
 01 авг. 2013 г., 12:30
AdjustViewBounds недостаточно, он "не увеличит размер ImageView сверх естественных размеров рисованного элемента":stackoverflow.com/a/7732684/804479
 06 мар. 2014 г., 11:46
отлично сработало для меня! большое спасибо
 garbagecollector31 мая 2012 г., 21:08
Не работает. Я не могу опубликовать изображения, потому что они являются собственностью, но они просто стандартные PNG 128x128. Это также происходит на эмуляторе. Так что это не конкретные проблемы устройства. Эти изображения меньше, чем ImageView. Я думаю, что здесь проблема.
 06 апр. 2014 г., 05:57
Я думаю, что решение состоит в том, чтобы использовать scaleType = "centerCrop", если вы можете принять изображение, которое будет обрезано ...

Используйте этот код: android:scaleType="fitXY"

Подробнее о масштабировании изображения смотрите в статье, приведенной в этой статье.Вот

Резюме:

center

Center the image in the view, but perform no scaling

enter image description here

centerCrop

Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding). The image is then centered in the view

enter image description here

centerInside

Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding)

enter image description here

fitCenter

enter image description here

fitEnd

enter image description here

fitStart

enter image description here

fitXY

enter image description here

matrix

Scale using the image matrix when drawing

enter image description here

больше деталейВот новая статья

 19 нояб. 2015 г., 11:00
Я отредактировал свой ответ, чтобы охватить все случаи :)
 28 мар. 2014 г., 16:56
Потому что он не поддерживает соотношение сторон исходного изображения. Увидетьhere.
 05 февр. 2014 г., 03:27
Почему этот ответ не имеет права голоса? Только этот работает для меня!
 12 мар. 2016 г., 15:29
Показывать все случаи с каждым изображением было очень полезно для меня. Спасибо!
 01 нояб. 2016 г., 20:07
Если ImageView.background = # 000000, вы видите, что ImageView занимает пространство родительского макета;

Используйте этот код с параметрами макета представления в качестве wrapcontent

Android: adjustViewBounds = & Quot; истинно & Quot;

Надеюсь, это сработает.

 01 авг. 2013 г., 12:29
AdjustViewBounds недостаточно, он "не увеличит размер ImageView сверх естественных размеров рисованного элемента":stackoverflow.com/a/7732684/804479

Ваш ответ на вопрос