ConstraintLayout: невозможно масштабировать изображение в соответствии с соотношением в RecyclerView

  • у меня есть представление recycler с StaggeredGridLayoutManager.
  • внутри у меня есть пользовательские элементы / представления.
  • каждый элемент определяется как ConstraintLayout, где есть изображение, которое должно иметь постоянное соотношение сторон.
  • но изображение должно по-прежнему иметь возможность масштабироваться, чтобы соответствовать ширине каждого пролета.
  • и после этого высота должна быть отрегулирована согласно коэффициенту.

но почему-то изображения не сохраняя пропорции.

вот xml-файлы и код для создания представления recycler:

товар.в XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp">


    <ImageView
        android:id="@+id/image"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintDimensionRatio="16:9"
        tools:src="@drawable/ic_logo" />


    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="@+id/image"
        android:textColor="@color/white"
        tools:text="SAMPLE"
        android:paddingBottom="10dp"
        android:layout_margin="5dp"/>

</android.support.constraint.ConstraintLayout>

активности.в XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_marginTop="5dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true" />

</RelativeLayout>

код для создания всего представления:

adapter = new SampleAdapter(list);
        StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        sampleRecyclerView.setLayoutManager(manager);
        sampleRecyclerView.setAdapter(adapter);

ширина каждого элемента устанавливается отлично и соответствует ширине каждого столбца. Но высота не поддерживается и очень мало.

может кто-нибудь помочь?

спасибо

1 ответов


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

вы также можете использовать ratio, если оба измерения имеют значение MATCH_CONSTRAINT (0dp). В этом случае система устанавливает наибольшие размеры, удовлетворяет всем ограничениям и поддерживает заданное соотношение сторон. Чтобы ограничить один конкретный сторона, основанная на измерениях другого. Вы можете предварительно добавить W" или H, чтобы ограничить ширину или высоту соответственно. Например, если одно измерение ограничено двумя целями (например, ширина 0dp и центрирована на родительском), вы можете указать, какая сторона должна быть ограничена, добавив букву W (для ограничения ширины) или H (для ограничения высоты) перед соотношением, разделенным запятой:

     <Button android:layout_width="0dp"
               android:layout_height="0dp"
               app:layout_constraintDimensionRatio="H,16:9"
               app:layout_constraintBottom_toBottomOf="parent"
               app:layout_constraintTop_toTopOf="parent"/>

Итак, в вашем случае, я бы попытался app:layout_constraintDimensionRatio="H,16:9".

кроме того, я не думаю, что вам понадобится android:scaleType="centerCrop" или adjustViewBounds но вам придется попробовать, чтобы увидеть.