ImageView: adjustViewBounds не работает с layout_height = "fill_parent"?
Я пытаюсь разместить в одной строке EditText
с помощью ImageView
слева. Но я не могу правильно масштабировать изображение, чтобы соответствовать высоте ввода текста.
Макет прост:
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:adjustViewBounds="true"
android:scaleType="fitStart"
android:background="#f00"
android:src="@drawable/icon" />
<EditText
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
(я выделил изображение фона красным цветом, чтобы увидеть фактическое пространство, выделенное ImageView)
Если я задаю точную высоту для ImageView
:
android:layout_height="48dp"
тогда я получаю самое близкое представление о том, что мне нужно:
![enter image description here]()
Но я не знаю точную высоту EditText
, поэтому я не могу указать ее для ImageView
здесь.
Когда высота для ImageView
указана для заполнения родительского элемента (для соответствия высоте `EditText`):
android:layout_height="fill_parent"
то я получаю неожиданный дополнительный запас между изображением и текстовой записью:
![enter image description here]()
Собственно, в этом случае ширина ImageView
равна ширине немасштабированного изображения, тогда как изображение масштабируется.
Это похоже на изображение, показанное ниже, если я укажу layout_height
на 48dp
и установите adjustViewBounds
в false
:
android:layout_height="48dp"
android:adjustViewBounds="false"
![enter image description here]()
Итак, вопрос заключается в следующем: как правильно определить макет для масштабирования изображения, чтобы он соответствовал высоте ввода ввода и в то же время, чтобы ширина ImageView
сокращалась до масштабированной ширины изображения? Другими словами, как избавиться от лишнего пространства?
Ответы
Ответ 1
Это ошибка LinearLayout. Если вы посмотрите forceUniformHeight
в источнике здесь. Вы можете видеть, что для обработки размеров дочерних представлений, которые поставляют match_parent
как высоту, когда LinearLayout имеет значение wrap_content
, LinearLayout претендует на абсолютную высоту, пересчитывает высоту ребенка и затем повторно использует ширину дочернего элемента из предыдущего измерения проходить. В основном ваше изображение вычисляет высоту и ширину без ограничений и получает ширину и высоту по умолчанию, а затем вычисляет высоту, но вынуждает использовать старую ширину. Вам нужно будет указать высоту или переопределить некоторый вид onMeasures
Ответ 2
вы также можете установить гравитацию в центр на линейном макете
ПРИМЕЧАНИЕ. что вы также должны иметь разные изображения в drawables-hdpi/ldpi и mdpi