Комментарии 6
Теперь я уже не имею причин не использовать (пробовать) ConstraintLayout. До этого момента отпугивали не только возможные баги, но и малое количество обзорных материалов «где все по полочкам». Большое спасибо за проделанный анализ!
Столкнулись ли вы с багами, с какими? Пытались ли вы объективно сравнить время отрисовки классической верстки на Relative/Frame/Linear-layouts и с ConstraintLayout. Посоветуете инструмент?
Столкнулись ли вы с багами, с какими? Пытались ли вы объективно сравнить время отрисовки классической верстки на Relative/Frame/Linear-layouts и с ConstraintLayout. Посоветуете инструмент?
Очевидные баги самого ConstraintLayout большинство пофикшены, я еще в октябре с ним разбирался — было очень много багов, сейчас явных не замечал. Во всяких странных кейсах типа «привязать view с внешней стороны контейнера, а к ней привязать другую view» скорее всего будут проблемы)
При работе с ConstraintSet точно есть баги еще. Например, изменить веса у меня нормально не получилось в цепи через него.
Насчет производительности — это отдельная тема, тут надо исходники смотреть подробно.
К примеру, я точно знаю, что если view сама вызвала requestLayout (например, у нее стояла ширина any_size и был изменен текст), то ConstraintLayout полностью перестроит граф зависимостей, а это может занимать много времени. Это из кейсов изменения графа в рантайме.
Другой тип кейсов — если сам граф зависимостей будет сложный, то расчет размеров может занимать много времени. Я подозреваю, что такое часто получается, если связывать горизонтальные и вертикальные зависимости (например, через dimensionRation).
В общем, я бы не стал просто брать рядом LinearLayout и ConstraintLayout, смотреть, сколько занимает onMeasure+onLayout и делать из этого какие-то выводы)
При работе с ConstraintSet точно есть баги еще. Например, изменить веса у меня нормально не получилось в цепи через него.
Насчет производительности — это отдельная тема, тут надо исходники смотреть подробно.
К примеру, я точно знаю, что если view сама вызвала requestLayout (например, у нее стояла ширина any_size и был изменен текст), то ConstraintLayout полностью перестроит граф зависимостей, а это может занимать много времени. Это из кейсов изменения графа в рантайме.
Другой тип кейсов — если сам граф зависимостей будет сложный, то расчет размеров может занимать много времени. Я подозреваю, что такое часто получается, если связывать горизонтальные и вертикальные зависимости (например, через dimensionRation).
В общем, я бы не стал просто брать рядом LinearLayout и ConstraintLayout, смотреть, сколько занимает onMeasure+onLayout и делать из этого какие-то выводы)
А есть возможность выровнять элемент по центру высоты соседнего элемента без использования дополнительного внешнего контейнера?
В левом верхнем углу есть ImageView, справа от него привязал вертикальный LinearLayoyt с 2 TextView.
</android.support.constraint.ConstraintLayout>
Сборка в spread chain (spread) не помогает. По старому я бы просто поместил и ImageView и LinearLayout в relative-контейнер (wrap-content по высоте), разместил бы их относительно друг друга как надо ( android:layout_height=«wrap_content» не забыл бы) и каждому бы ещё android:layout_centerVertical=«true» добавил.
А тут как-то с baseline можно попробовать или всё те же контейнеры?
В левом верхнем углу есть 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»/>
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
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Работа с ConstraintLayout через XML-разметку