Изображения Android для заполнения доступной ширины правильной высотой

#android #android-layout #android-recyclerview #android-linearlayout #android-imageview

#Android #android-layout #android-recyclerview #android-linearlayout #android-просмотр изображений

Вопрос:

Я пытаюсь создать элемент просмотра recycler, чтобы отображать несколько строк из нескольких изображений бок о бок:

  • [изображение 1] [изображение 2] [изображение 3]
  • [изображение 4] [изображение 5] [изображение 6]
  • [изображение 7] [изображение 8] [изображение 9]

Я хочу избежать установки какой-либо ширины или высоты, поскольку я хочу, чтобы изображения масштабировались, чтобы заполнить доступную ширину экрана. Я пытаюсь сделать это с помощью чисто XML-макета Android (ie. предпочел бы не делать это программно, если это возможно) и хочу избежать установки фиксированной высоты. Однако я не могу найти какие-либо применимые настройки высоты для достижения этого.

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

Смотрите на изображении ниже, синяя линия показывает высоту контейнера, что создает впечатление большого количества непреднамеренных полей / отступов.

Возможно ли изменить следующее, чтобы также обрезать высоту оболочки, чтобы более точно соответствовать изображениям?

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@ id/card_1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:src="@drawable/card_ha" />

        <ImageView
            android:id="@ id/card_2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:src="@drawable/card_ha" />

        <ImageView
            android:id="@ id/card_3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:src="@drawable/card_ha" />
    </LinearLayout>
</layout>
  

введите описание изображения здесь

Комментарии:

1. Может быть android:scaleType=»centerCrop» для ImageView?

2. К сожалению, нет. Хороший стиль предложения-7, но перепробовал все scaleType значения и ничего хорошего.

3. Я сделал это, но программно только с помощью метода переопределения onWindowsFocusChanged

Ответ №1:

Вы пробовали adjustViewBounds ?

Смотрите, согласно официальной документации, а также моему опыту использования, adJustViewBounds выполняет работу из xml для настройки ImageView's границ в соответствии с соотношением изображение / рисуемое, как также указано на изображении, прикрепленном ниже.

введите описание изображения здесь

Итак, если вы установите width значение 0dp и height на wrap_content , что вы уже сделали, размер ImageView будет скорректирован в соответствии с соотношением сторон.

Чтобы сделать это: Добавьте android:adjustViewBounds="true" во все ImageViews теги. Вам не нужно делать что-либо еще программно или в xml.

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

Комментарии:

1. Ты легенда. Я был уверен, что должен быть «однострочный» способ сделать это! Я также проверю GridView, спасибо!

2. @JosephMcDermott Я рад, что это помогло. Пожалуйста. И вам нужно, GridView поскольку для структуры типа 2d-массива, как вы показали в начале своего вопроса, GridView это ключ, передайте ему единый ImageView макет и максимальное количество просмотров в одной строке (оптимально 3-4), и он заполнит 2d-структуру. Кроме того, вы можете дополнительно создавать галерею / фотографии, подобные структуре, увеличивая / уменьшая вид с помощью жеста масштабирования.