Comments 17
Так в результате у вас осталось поведение от самого BottomSheetDialog(свайп вверх/вниз)?
Или каждый фрагмент просто визуально косит под BottomSheetDialog?
private fun prepareFadeInAnimator(view: View): Animator =
ObjectAnimator.ofFloat(view, "alpha", 0f, 1f)
При использовании ObjectAnimator
рекомендуется передавать поле не по его имени("alpha", "translationX"), а по его проперти ObjectAnimator.ofFloat(T target, Property<T, Float> property, float… values). Такой вариант избавляет от вызова сеттера этого поля через рефлексию. Так же является типобезопасным, ведь можно легко сделать опечатку "alfa"
вместо View.ALPHA
или "transletionX"
вместо View.TRANSLATION_X
.
На примере Plaid от Ника Батчера.
Все эти проперти так же есть и в AppCompat варианте.
Странно конечно что в документации не говорится про такой прием, тем не менее эта тема достаточно часто вскрывалась на конференциях с участием Chet Haase и Romain Guy.
Спасибо за статью! Идея с контейнером-шаред элементом классная, но есть пара пара замечаний по коду внутри:
- Не советую использовать зашитые в Android константы для определения размера статус-бара. Это плохая практика, и на различных девайсах от Meizu, Dogee, и прочих нонеймах с кастомными надстройками работать не будет. Советую работать через windowInsets, статей по этому подходу достаточно много, например здесь: https://habr.com/ru/company/surfstudio/blog/464373/
- В методе getScreenHeight используется только статус бар, но при этом мы забываем про высоту навигейшн-бара, из-за чего на девайсах с нижним баром навигации, контейнеры улетят вверх.
- Высоту и ширину экрана можно получить гораздо проще, без необходимости прибегать к системным сервисам: view.resources.displayMetrics содержит нужную инфу.
- Вы абсолютно правы, что использовать insets правильнее, чем получать высоту системных отступов (в нашем случае — статус бара) вручную. Но тут есть один момент — «из коробки» BottomSheetDialog не позволяет обрабатывать inset'ы (об этом на своём митапе рассказывали ребята из Redmadrobot, вот ссылка на комментарий и митап). Это происходит из-за fitsSystemWindows=«true» у CoordinatorLayout'а в BottomSheetDialog. Я посчитал, что решение этой проблемы за рамками данной статьи, поэтому остаётся два простых варианта, как рассчитать доступную высоту — из высоты экрана вычесть либо padding'и CoordinatorLayout'а (padding'и установятся автоматически за счет fitsSystemWindows=«true»), либо высоту status bar'а. Я посчитал, что между этими вариантами разницы нет, но возможно лучше было взять использовать padding'и CoordinatorLayout'а
- «В методе getScreenHeight используется только статус бар» — всё верно, так и должно быть. Метод Display.getSize(), который я использовал для получения высоты экрана, внутри себя уже убирает некоторые системные выступы из общей высоты, например, он вычитает высоту navigation бара (проверено на устройствах с navigation баром). Возможно, правильнее было бы использовать Display.getRealSize(), который возвращает полный размер экрана, и вычесть высоту и статус бара, и navigation бара (а еще правильнее, еще раз соглашусь с вами, — использовать inset'ы)
- Да, можно так, это проще
Я мог что-то упустить, поэтому буду рад дополнительным комментариям :)
Спасибо за ваш комментарий, рад, что вам понравилась анимация!
А какое решение используете для планшетов? Также BottomSheet?
Анимация в Android: плавные переходы фрагментов внутри Bottom Sheet