Как сделать изображение максимально большим при сохранении соотношения сторон - PullRequest
18 голосов
/ 20 сентября 2011

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

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

<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 s.

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

На следующем рисунке приведен код выше:

enter image description here enter image description here

  Current behaviour               Desired Behaviour

Редактировать

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

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

Ответы [ 2 ]

7 голосов
/ 20 сентября 2011

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

EDIT

    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));
        }
    });
1 голос
/ 20 сентября 2011

Похоже, вы хотите fitCenter, который использует Matrix.ScaleToFit CENTER .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...