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

Как сделать изображение как можно большим при сохранении пропорций

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

Чтобы проиллюстрировать эту проблему:

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

Верхняя часть ImageView будет растянута, чтобы заполнить ширину контейнера. Содержимое @drawable, которое оно содержало, также растягивалось вдоль оси x, чтобы соответствовать ширине ImageView, которая является совершенной. Однако проблема состоит в том, что размер, обозначенный wrap_content, в этом случае высота, остается того же размера, что и начальная высота @drawable.

Я прочитал документацию относительно ScaleType здесь и не могу найти ответ там.

Следующее изображение описывает приведенный выше код:

enter image description hereenter image description here

  Current behaviour               Desired Behaviour

Edit

An ImageView с учетом scaleType="fitCenter" будет точно расширять/сокращать @drawable внутри него, чтобы расти как можно больше, сохраняя его соотношение сторон.

Размеры ImageView определены до того, как @drawable будет масштабироваться любым способом. Размеры ImageView не выполняются путем масштабирования, содержащегося в нем @drawable.

4b9b3361

Ответ 1

XML

Единственное решение для этого в XML - это использовать "match_parent" или дискретное максимальное значение вместо "wrap_content", где это возможно. Это обеспечит правильный размер ImageView, что означает, что добавление scaleType="fitCenter" обеспечит правильное масштабирование @drawable.

Programatically

Это некрасиво, но вы можете изменить размер ImageView после того, как его размеры были предоставлены дискретными значениями:

    final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail);  

    ViewTreeObserver thumbnailViewVto = thumbnailView.getViewTreeObserver();
    thumbnailViewVto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        private boolean changed = false;
        @Override
        public void onGlobalLayout() {
            if(!changed) {
                Drawable image = getResources().getDrawable(R.drawable.thumbnail);
                float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight();
                int height = thumbnailView.getHeight();

                thumbnailView.setLayoutParams(
                        new LayoutParams(
                                (int) (height * heighToWidthRatio), height));
                changed = true;
            }
        }
    });

ИЗМЕНИТЬ

    final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail);  

    thumbnailView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // Remove the GlobalOnLayout Listener so it only fires once.
            thumbnailView.getViewTreeObserver().removeGlobalOnLayoutListener(this)

            // Find the images Height to Width ratio
            Drawable image = getResources().getDrawable(R.drawable.thumbnail);
            float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight();

            // Use this ratio to discover the ratio of the ImageView to allow it to perfectly contain the image.
            int height = thumbnailView.getHeight();
            thumbnailView.setLayoutParams(new LayoutParams(
                                (int) (height * heighToWidthRatio), height));
        }
    });