Размер изображения Android ImageView не масштабируется с исходным изображением
У меня есть несколько 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 - это ширина немасштабированного изображения - фактические уменьшенные изображения, появляющиеся в левой части их ImageViews. Из-за этого я получаю большой разрыв между изображениями.
В идеале я хотел бы управлять этим через 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, чтобы я мог рассчитать необходимую ширину для пользовательских изображений?
Спасибо, если вам это удалось. Еще больше спасибо, если вы можете указать мне в сторону решения!
Ответы
Ответ 1
Как насчет того, чтобы изменить ImageViews на использование android:layout_height="fill_parent"
?
Изменить. Мне понадобилось некоторое время, чтобы найти, но, глядя на источник, я помог мне определить adjustViewBounds. Возможно, вы захотите добавить android:adjustViewBounds="true"
к своим ImageViews. Удивительно, но по умолчанию это значение равно false.
Ответ 2
Странно android:layout_height="fill_parent"
и android:adjustViewBounds="true"
не помогли. Проблема, с которой я столкнулась, - это изображение, которое отображается, но с блочной строкой сверху и черной строкой внизу изображения. Настройка типа шкалы на "centerCrop"
помогла мне. Полагаю, причина в том, что размер моего изображения был небольшим.
Ответ 3
У меня была аналогичная проблема, и моим решением было установить атрибут android:scaleType="fitEnd"
ImageView в файле макета XML.
Ответ 4
Вы можете посмотреть ответ здесь.
Это может быть альтернативой для android:adjustViewBounds="true"