Как стать автором
Обновить

Custom Bottom Sheet: как это должно работать

Время на прочтение2 мин
Количество просмотров12K

Предисловие


Не так давно я прочитал статью о Bottom Sheet'e и, посовещавшись с коллегами, принял решение внедрить данную штуку в наше приложение. Потратив достаточно часов с целью научить Bottom Sheet выезжать в несколько шагов (like Google Maps), я осознал его тупость и ограниченность. Было найдено два решения: оборачивать всё в поток, который будет отслеживать состояние вытянутой шторки в реальном времени или же переписать некоторые методы класса BottomSheetBehavior (благо, лицензия Apache 2.0 позволяет это делать). Я выбрал второй вариант, ибо он показался мне более жизнеспособным, и сейчас, опираясь на свой опыт, я постараюсь поведать вам что из этого вышло. Надеюсь, что кому-то это пригодится. Что-ж, приступим.


Кастомизация


Я опускаю этапы создания проекта, добавление в него гугловского Bottom Sheet'a, ибо если вы читаете это, то всё вышеперечисленное уже преодолели. Нам понадобится перейти в класс BottomSheetBehavior и скопировать его содержимое в новый, нами созданный класс CustomBottomSheetBehavior. После того как скопировали, не забудьте переименовать всё, что отметится красным цветом. Также, в .xml файле нашего BottomSheet'a следует переименовать эту строку, ссылаясь на наш новый класс, должно получиться как-то так:


app:layout_behavior="com.my.custombottomsheetexample.CustomBottomSheetBehavior"

И так, мы имеем 700+ строк кода на Java, который выглядит страшно, что же с ними делать?
Для начала необходимо найти метод onViewReleased():


public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) {

        ...

}

Нам понадобится изменить всего пару строк. Находим первый if {...} и заменяем его содержимое на этот код:


if (yvel < 0.0F) {
        currentTop = releasedChild.getTop();
        if (currentTop > CustomBottomSheetBehavior.this.halfExpandedOffset) {
        top = CustomBottomSheetBehavior.this.halfExpandedOffset;
        targetState = 6;
} else {
        top = 0;
        targetState = 3;
    }
}

Теперь наш BottomSheet выдвигается в 2 этапа, останавливаясь посередине:


()


Изменение высоты


Но это ещё не всё, вы можете регулировать среднюю высоту. Для этого всё в том же классе найдите инициализацию переменной halfExpandedOffset:


this.halfExpandedOffset = this.parentHeight / 2;

При взгляде на эту строку становится понятно, что высоту мы можем настроить как нам угодно, даже в процентном соотношении. Лично я предпочёл изменить так:


this.halfExpandedOffset = this.parentHeight * 60 / 100;

()


Мой BottomSheet выдвигается на 40% от высоты основного View. На этом всё!

Теги:
Хабы:
Всего голосов 12: ↑9 и ↓3+6
Комментарии8

Публикации

Истории

Работа

Java разработчик
395 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
24 сентября
Astra DevConf 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн