Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android-constraintlayout. Показать все сообщения
Показаны сообщения с ярлыком android-constraintlayout. Показать все сообщения

среда, 4 марта 2020 г.

Таблица или ConstraintLayout?

#android #android_layout #android_constraintlayout


Делаю первое приложение. Мне нужно, чтобы два таймера снизу - всегда находились в
серединах двух половинок (по горизонтали). Иначе говоря, будто они в серединах двух
столбцов таблицы. А черточки должны начинаться снизу, как на картинке.
Пока работал только с ConstraintLayout, и уже замучился. У него привязка идет к краю
элемента. Т.е. если размер элемента меняется, то все двигается, да и он сам не остается
на месте. А у меня, например 01 час меняется на 1. 
В сторону чего мне смотреть?  


    


Ответы

Ответ 1



Для верстки такого макета на понадобятся опорные линии (guidline). На макет размещаем три опорных линии (правый клик на визуальном редакторе разметки: Helpers -> Add vertical\horizontal guidelines): две вертикальных (1 и 2) и одну горизонтальную (3). Вертикальные делят экран на 3 равные части (33% и 66%), горизонтальная - верхнюю четверть (25%). Чтобы изменить позицию опорной линии на проценты нужно щелкать на кружок. Теперь закрепляем виджеты. Левые счетчики крепим правым краем к первой опорной линии,левым краем к краю экрана (чтобы можно было провести черту до конца экрана). При этом верхний низом к 3 опорной линии, а нижний верхом к ней же. Этим виджетам ставим атрибут android:gravity="right", чтобы текст начинался от правого края. Правый счетчик крепим левой стороной ко второй опорной линии, правой стороной к краю экрана, а верхом и низом к верху и низу левого нижнего счетчика - так они будут располагаться на одном уровне по горизонтали. Кнопку и текст равномерно распределяем на оставшееся пространство по вертикали через инструмент chains (правая кнопка мыши: Center -> Center Verticaly). Линии под счетчиками можно сделать, просто указав этим виджетам в качестве фона изображение 9-path с чертой снизу - это самый простой вариант (в примере я делать этого не буду). Вот что в итоге получилось: Разметка:

среда, 22 января 2020 г.

Recyclerview не растягивается при освобождении места в layout несмотря на match_parent

#android #recyclerview #android_animation #android_constraintlayout


Ломаю голову и рою гугл уже несколько дней, не могу понять, по какой причине recyclerView
не растягивается при появлении свободного пространства.  

Задача такая: при прокрутке списка (recycler) вниз на хотя бы 1 элемент, view-элементы
над списком "ужимаются" и дают дополнительное место для списка. "Ужимаю" я их с помощью
анимации и библиотеки expectAnim. Привожу ниже xml layout'а, а так же скрины проблемы
и фрагмент кода анимации.





































А вот как это выглядит в результате:




При этом не суть важно, если ресайкл перемещается вслед за линией, например, то такое
же пространство у него появляется ПОД ним.

А как заставить его растягиваться? Пробовал и setHasFixedSize(false), и получать
layout и через params.height задавать значение, а после requestLayout() дёргать. Но
всё без толку.

Может быть я вообще не под тем углом смотрю на задачу?
    


Ответы

Ответ 1



На всякий случай отвечу на собственный вопрос, мало ли кто столкнётся с похожей проблемой. Проблема была в том, что проанимированные элементы не исчезали (GONE), а... не знаю даже, что там с ними библиотека делала. Похоже, что просто оставляла за пределами видимой части экрана. После проигрывания анимации ставлю им View.GONE, и делаю LinearLayout resize для RecyclerView - всё работает. Правда, появились доп. проблемы, как то, что при увеличении ресайкла "вверх", список в нём надо прокручивать (через вызов scrollToPosition). Но это уже мелочи.

понедельник, 20 мая 2019 г.

Таблица или ConstraintLayout?

Делаю первое приложение. Мне нужно, чтобы два таймера снизу - всегда находились в серединах двух половинок (по горизонтали). Иначе говоря, будто они в серединах двух столбцов таблицы. А черточки должны начинаться снизу, как на картинке. Пока работал только с ConstraintLayout, и уже замучился. У него привязка идет к краю элемента. Т.е. если размер элемента меняется, то все двигается, да и он сам не остается на месте. А у меня, например 01 час меняется на 1. В сторону чего мне смотреть?


Ответ

Для верстки такого макета на понадобятся опорные линии (guidline).
На макет размещаем три опорных линии (правый клик на визуальном редакторе разметки: Helpers -> Add vertical\horizontal guidelines): две вертикальных (1 и 2) и одну горизонтальную (3). Вертикальные делят экран на 3 равные части (33% и 66%), горизонтальная - верхнюю четверть (25%). Чтобы изменить позицию опорной линии на проценты нужно щелкать на кружок.

Теперь закрепляем виджеты. Левые счетчики крепим правым краем к первой опорной линии,левым краем к краю экрана (чтобы можно было провести черту до конца экрана). При этом верхний низом к 3 опорной линии, а нижний верхом к ней же. Этим виджетам ставим атрибут android:gravity="right", чтобы текст начинался от правого края. Правый счетчик крепим левой стороной ко второй опорной линии, правой стороной к краю экрана, а верхом и низом к верху и низу левого нижнего счетчика - так они будут располагаться на одном уровне по горизонтали. Кнопку и текст равномерно распределяем на оставшееся пространство по вертикали через инструмент chains (правая кнопка мыши: Center -> Center Verticaly).
Линии под счетчиками можно сделать, просто указав этим виджетам в качестве фона изображение 9-path с чертой снизу - это самый простой вариант (в примере я делать этого не буду).
Вот что в итоге получилось:

Разметка:







вторник, 12 марта 2019 г.

Recyclerview не растягивается при освобождении места в layout несмотря на match_parent

Ломаю голову и рою гугл уже несколько дней, не могу понять, по какой причине recyclerView не растягивается при появлении свободного пространства.
Задача такая: при прокрутке списка (recycler) вниз на хотя бы 1 элемент, view-элементы над списком "ужимаются" и дают дополнительное место для списка. "Ужимаю" я их с помощью анимации и библиотеки expectAnim. Привожу ниже xml layout'а, а так же скрины проблемы и фрагмент кода анимации.

















А вот как это выглядит в результате:

При этом не суть важно, если ресайкл перемещается вслед за линией, например, то такое же пространство у него появляется ПОД ним.
А как заставить его растягиваться? Пробовал и setHasFixedSize(false), и получать layout и через params.height задавать значение, а после requestLayout() дёргать. Но всё без толку.
Может быть я вообще не под тем углом смотрю на задачу?


Ответ

На всякий случай отвечу на собственный вопрос, мало ли кто столкнётся с похожей проблемой. Проблема была в том, что проанимированные элементы не исчезали (GONE), а... не знаю даже, что там с ними библиотека делала. Похоже, что просто оставляла за пределами видимой части экрана.
После проигрывания анимации ставлю им View.GONE, и делаю LinearLayout resize для RecyclerView - всё работает.
Правда, появились доп. проблемы, как то, что при увеличении ресайкла "вверх", список в нём надо прокручивать (через вызов scrollToPosition). Но это уже мелочи.