Pull to refresh

Comments 6

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

Столкнулись ли вы с багами, с какими? Пытались ли вы объективно сравнить время отрисовки классической верстки на Relative/Frame/Linear-layouts и с ConstraintLayout. Посоветуете инструмент?
Очевидные баги самого ConstraintLayout большинство пофикшены, я еще в октябре с ним разбирался — было очень много багов, сейчас явных не замечал. Во всяких странных кейсах типа «привязать view с внешней стороны контейнера, а к ней привязать другую view» скорее всего будут проблемы)

При работе с ConstraintSet точно есть баги еще. Например, изменить веса у меня нормально не получилось в цепи через него.

Насчет производительности — это отдельная тема, тут надо исходники смотреть подробно.
К примеру, я точно знаю, что если view сама вызвала requestLayout (например, у нее стояла ширина any_size и был изменен текст), то ConstraintLayout полностью перестроит граф зависимостей, а это может занимать много времени. Это из кейсов изменения графа в рантайме.
Другой тип кейсов — если сам граф зависимостей будет сложный, то расчет размеров может занимать много времени. Я подозреваю, что такое часто получается, если связывать горизонтальные и вертикальные зависимости (например, через dimensionRation).

В общем, я бы не стал просто брать рядом LinearLayout и ConstraintLayout, смотреть, сколько занимает onMeasure+onLayout и делать из этого какие-то выводы)
А есть возможность выровнять элемент по центру высоты соседнего элемента без использования дополнительного внешнего контейнера?

В левом верхнем углу есть ImageView, справа от него привязал вертикальный LinearLayoyt с 2 TextView.

Разметка
<android.support.constraint.ConstraintLayout
xmlns:android=«http://schemas.android.com/apk/res/android»
android:layout_width=«match_parent»
android:layout_height=«match_parent»
xmlns:app=«http://schemas.android.com/apk/res-auto»
android:id="@+id/root">

<ImageView
android:id="@+id/image"
app:layout_constraintLeft_toLeftOf="@id/root"
app:layout_constraintRight_toLeftOf="@id/text_container"
android:layout_width=«wrap_content»
android:layout_height=«wrap_content»
android:src="@drawable/logo"
/>

<LinearLayout
android:id="@+id/text_container"
app:layout_constraintLeft_toRightOf="@id/image"
android:orientation=«vertical»
android:layout_width=«wrap_content»
android:layout_height=«wrap_content»>

<TextView
android:id="@+id/count"
android:layout_width=«wrap_content»
android:layout_height=«wrap_content»
android:text=«Products count» />

<TextView
android:id="@+id/price"
android:layout_width=«wrap_content»
android:layout_height=«wrap_content»
android:text=«Price»/>


</android.support.constraint.ConstraintLayout>



Сборка в spread chain (spread) не помогает. По старому я бы просто поместил и ImageView и LinearLayout в relative-контейнер (wrap-content по высоте), разместил бы их относительно друг друга как надо ( android:layout_height=«wrap_content» не забыл бы) и каждому бы ещё android:layout_centerVertical=«true» добавил.

А тут как-то с baseline можно попробовать или всё те же контейнеры?
Разметка
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<!-- тут еще можно добавить bias=0, если элементы по левому краю должны быть выровнены -->
    <ImageView
        app:layout_constraintHorizontal_chainStyle="packed"
        android:id="@+id/logo"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        app:layout_constraintHeight_default="wrap"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/texts"
        app:layout_constraintTop_toTopOf="parent"
        android:src="@drawable/logo"/>

    <LinearLayout
        android:id="@+id/texts"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHeight_default="wrap"
        app:layout_constraintLeft_toRightOf="@+id/logo"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="COUNT"/>

        <TextView
            android:id="@+id/price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="PRICE"/>

    </LinearLayout>

</android.support.constraint.ConstraintLayout>

Это ваш модифицированный вариант — обе вьюхи по вертикали привязываются к верхним сторонам констрейнта и им ставится высота match_constraint_wrap. По умолчанию bias=0.5, так что они отцентрируются по вертикали.


Если попробовать избавиться от LinearLayout'a, то, к сожалению, можно напороться на багу

Хотя про багу это я погорячился — это просто очень крутое не очевидное поведение)

При этом перед значением можно указать символ стороны, которая находится в числителе соотношения. Например, H,16:9 будет означать, что 16 — это значение, соотвествующее высоте (H), а 9 — ширине (W).

Это абсолютно неверно. Смысл буквы совсем другой, а именно, указывает, ширина или высота будет вычислена на основе constraint'ов, а оставшаяся сторона — из aspect ratio
Sign up to leave a comment.