Размер Android ImageView не масштабируется с исходным изображением - PullRequest
72 голосов
/ 18 марта 2011

У меня есть несколько ImageViews внутри LinearLayout.Мне нужно уменьшить ImageViews, чтобы они сохраняли свои пропорции, в то время как они помещаются в LinearLayout по вертикали.По горизонтали мне просто нужно, чтобы они были смежными друг с другом.

Для этого я создал упрощенный тестовый стенд, в который вложены взвешенные макеты, чтобы у меня был широкий, но не очень высокий LinearLayout для ImageViews -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
    <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="5">
        <LinearLayout android:id="@+id/linearLayout3" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
            <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
            <ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
        </LinearLayout>
        <LinearLayout android:id="@+id/linearLayout4" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"></LinearLayout>
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>

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

При работе на оборудованииИзображения масштабируются до правильной высоты, сохраняя при этом их пропорции.Моя проблема в том, что они не рядом друг с другом.Высота каждого ImageView правильно соответствует высоте LinearLayout.Ширина каждого ImageView - это ширина немасштабированного изображения - фактическое уменьшенное изображение, отображаемое слева от их ImageView.Из-за этого я получаю большой разрыв между изображениями.

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

Я попытался создать класс IconView (extends ImageView), который переопределяет onMeasure, чтобы я мог создавать представления изображений необходимого размера, масштабируя ширину в зависимости от высоты.Но parentWidth и parentHeight, передаваемые в функцию, были размерами экрана, а не контейнера LinearLayout.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
  int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
  // Calculations followed by calls to setMeasuredDimension, setLayoutParams
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Так что мои вопросы -

1) Могу ли я изменить XMLкаким-то образом заставить его делать то, что мне нужно?

2) Как заставить мой пользовательский класс получить высоту LinearLayout, чтобы я мог рассчитать необходимую ширину для пользовательских изображений?

Спасибо, если вам удалось прочитать это далеко.Еще больше спасибо, если вы можете указать мне в направлении решения!

Ответы [ 3 ]

260 голосов
/ 18 марта 2011

Как насчет изменения ваших ImageViews для использования android:layout_height="fill_parent"?

Редактировать - мне потребовалось некоторое время, чтобы найти, но просмотр источника помог мне точно определить AdjustViewBounds . Возможно, вы захотите попробовать добавить android:adjustViewBounds="true" к вашим ImageViews. Удивительно, но по умолчанию это false.

11 голосов
/ 21 марта 2012

Странно android:layout_height="fill_parent" и android:adjustViewBounds="true" не помогли.У меня была проблема с отображением изображения, но со строкой блока сверху и черной строкой внизу изображения.Мне помогла установка типа шкалы на "centerCrop".Я думаю, причина в том, что мой размер изображения был маленьким.

6 голосов
/ 23 сентября 2013

У меня была похожая проблема, и мое решение было установить android:scaleType="fitEnd" атрибут ImageView в файле макета XML.

...