Размер изображения 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, чтобы я мог рассчитать необходимую ширину для пользовательских изображений?

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

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

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

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

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

Intereting Posts
GoogleMap внутри фрагмента в ViewPager, сохраняйте все события касания в GoogleMap Конфигурация проблем с mockito с eclipse. Дает ошибку: java.lang.verifyError Как сделать ярлык Android «Главная» обойти приложение, которое оно указывает на историю? GetQuantityString возвращает неверную строку с 0 значением Нити AsyncTask никогда не умирают Проблемы рендеринга Исключение, возникающее при рендеринге: com.android.ide.common.rendering.api.LayoutlibCallback После сохранения состояния коллапса / расширения для N-уровня или многоуровневого расширенного списка отдельных подгрупп не отображаются Плагин слишком стар, обновите его до более поздней версии или установите переменную окружения ANDROID_DAILY_OVERRIDE Расширение SSL для приложений Android Джексон не может десериализоваться на ForeignCollection (Ormlite) Альтернативы библиотеки Pixate Freestyle? Как сделать анимированный анимированный андроид? Android: как получить ImageView для заполнения экрана Развертывание файла во внутреннем хранилище при отладке Android "java.lang.RuntimeException: Parcelable сталкиваетсяClassNotFoundException, читающий объект Serializable"