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