Подтвердить что ты не робот

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 с несколькими scaleTypes: fitCenter, fitStart, fitEnd, centerInside, и все они рисуют изображения в правильном соотношении сторон, но ни один из них фактически не масштабирует изображения вверх и сам ImageView, в результате чего TextViews полностью отбрасываются с экрана, пустые пространства внутри ImageView, изображение не масштабируется или обрезается изображение.

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

4b9b3361

Ответ 1

Это:

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

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

Ответ 2

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

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

Резюме:

  • center

Центрируйте изображение в представлении, но не выполняйте масштабирование

enter image description here

  • centerCrop

Равномерно масштабируйте изображение (поддерживайте пропорции изображения), чтобы обе размеры (ширина и высота) изображения были равны или больше соответствующего размера представления (минус заполнение). Затем изображение центрируется в представлении

enter image description here

  • centerInside

Равномерно масштабируйте изображение (поддерживайте пропорции изображения), чтобы обе размеры (ширина и высота) изображения были равны или меньше соответствующего размера представления (минус заполнение)

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

Масштабирование с использованием матрицы изображений при рисовании

enter image description here

подробнее здесь новая статья

Ответ 3

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

Android: adjustViewBounds = "истинный"

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

Ответ 4

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

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

Ответ 5

Вы пытались настроить его программно? Я думаю, что это работает очень хорошо, если вы подсчитаете высоту своего 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);
}

Ответ 6

У меня была такая же проблема, 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" ...

Я изменил Relative layout на Linear layout с значениями 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"

Ответ 7

Установите android:layout_height="wrap_content" в режиме просмотра изображений. Чтобы создать изображение с шириной, равной ширине экрана, а высота пропорционально задана в соответствии с соотношением сторон, выполните следующие действия. Здесь я упоминаю, как загрузить изображение в изображение с 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);
                    }
                });

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