Подогнать изображение в ImageView, сохранить соотношение сторон, а затем изменить его размер до размеров изображения? - PullRequest
150 голосов
/ 22 ноября 2011

Как подогнать изображение произвольного размера к ImageView?Когда:

  • Первоначально ImageView размеры составляют 250dp * 250dp
  • Размер изображения должен быть увеличен / уменьшен до 250dp
  • Изображение должно сохранять свой аспектratio
  • Размеры ImageView должны соответствовать размерам масштабированного изображения после масштабирования

Например, для изображения 100 * 150 изображение и ImageView должны составлять 166 * 250.Например, для изображения 150 * 100 изображение и ImageView должны быть 250 * 166.

Если я устанавливаю границы как

<ImageView
    android:id="@+id/picture"
    android:layout_width="250dp"
    android:layout_height="250dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:adjustViewBounds="true" />

, то изображения правильно помещаются в ImageView, но ImageView всегда 250dp * 250dp.

Ответы [ 14 ]

3 голосов
/ 13 апреля 2017

Это было сделано для моего случая.

             <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:scaleType="centerCrop"
                android:adjustViewBounds="true"
                />
1 голос
/ 14 октября 2017

Мне нужно было ImageView и Bitmap, поэтому Bitmap масштабируется до размера ImageView, а размер ImageView совпадает с масштабированным Bitmap:).

Я просматривал этот пост длякак это сделать, и, наконец, сделал то, что я хочу, но не так, как описано здесь.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/acpt_frag_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/imageBackground"
android:orientation="vertical">

<ImageView
    android:id="@+id/acpt_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
    android:layout_margin="@dimen/document_editor_image_margin"
    android:background="@color/imageBackground"
    android:elevation="@dimen/document_image_elevation" />

, а затем в методе onCreateView

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_scanner_acpt, null);

    progress = view.findViewById(R.id.progress);

    imageView = view.findViewById(R.id.acpt_image);
    imageView.setImageBitmap( bitmap );

    imageView.getViewTreeObserver().addOnGlobalLayoutListener(()->
        layoutImageView()
    );

    return view;
}

, а затемlayoutImageView () code

private void layoutImageView(){

    float[] matrixv = new float[ 9 ];

    imageView.getImageMatrix().getValues(matrixv);

    int w = (int) ( matrixv[Matrix.MSCALE_X] * bitmap.getWidth() );
    int h = (int) ( matrixv[Matrix.MSCALE_Y] * bitmap.getHeight() );

    imageView.setMaxHeight(h);
    imageView.setMaxWidth(w);

}

В результате изображение идеально помещается внутрь, сохраняя пропорции, и не имеет лишних пикселей из ImageView, когда битмап находится внутри.

Результат

Важно, чтобы ImageView имел wrap_content и AdjustViewBounds в true, тогда будут работать setMaxWidth и setMaxHeight, это написано в исходном коде ImageView,

/*An optional argument to supply a maximum height for this view. Only valid if
 * {@link #setAdjustViewBounds(boolean)} has been set to true. To set an image to be a
 * maximum of 100 x 100 while preserving the original aspect ratio, do the following: 1) set
 * adjustViewBounds to true 2) set maxWidth and maxHeight to 100 3) set the height and width
 * layout params to WRAP_CONTENT. */
0 голосов
/ 02 июня 2019

Я использую очень простое решение. Вот мой код:

imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.getLayoutParams().height = imageView.getLayoutParams().width;
imageView.setMinimumHeight(imageView.getLayoutParams().width);

Мои изображения добавляются динамически в сетку. Когда вы выполняете эти настройки для просмотра изображений, изображение может автоматически отображаться в соотношении 1: 1.

0 голосов
/ 06 июля 2017

Мне нужно было сделать это в макете ограничений с помощью Picasso, поэтому я собрал воедино некоторые из приведенных выше ответов и нашел это решение (я уже знаю соотношение сторон загружаемого изображения, что помогает) :

Вызывается в коде активности где-то после setContentView (...)

protected void setBoxshotBackgroundImage() {
    ImageView backgroundImageView = (ImageView) findViewById(R.id.background_image_view);

    if(backgroundImageView != null) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int width = displayMetrics.widthPixels;
        int height = (int) Math.round(width * ImageLoader.BOXART_HEIGHT_ASPECT_RATIO);

        // we adjust the height of this element, as the width is already pinned to the parent in xml
        backgroundImageView.getLayoutParams().height = height;

        // implement your Picasso loading code here
    } else {
        // fallback if no element in layout...
    }
}

В моем XML

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="0dp">

    <ImageView
        android:id="@+id/background_image_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scaleType="fitStart"
        app:srcCompat="@color/background"
        android:adjustViewBounds="true"
        tools:layout_editor_absoluteY="0dp"
        android:layout_marginTop="0dp"
        android:layout_marginBottom="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginLeft="0dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <!-- other elements of this layout here... -->

</android.support.constraint.ConstraintLayout>

Обратите внимание на отсутствие атрибута constraintBottom_toBottomOf. ImageLoader - это мой собственный статический класс для загрузки утилитных методов и констант.

...