Android — создание серии приложений для подкастов: 1. мини-плеер в приложении
Начните писать здесь… В настоящее время я работаю над проектом по переписыванию существующего приложения для подкастов, которое изначально было создано с помощью xamarin, в полностью родное приложение для Android. Самая важная функция любого приложения для подкастов — это проигрыватель, а именно встроенный в приложение проигрыватель, который должен:
- быть видимым на всех экранах
- свернутый и развернутый вид
Давайте проясним второй момент: встроенный в приложение проигрыватель должен иметь два режима: свернутый режим, при котором область просмотра проигрывателя мала, и он должен располагаться ниже основного содержимого. Второй режим — это расширенный режим, в котором вид игрока должен занимать весь экран. В идеале должна быть анимация при переходе игрока между этими двумя состояниями. Поговорим о решении задачи №1.
Навигационная библиотека
Если мы используем навигационную библиотеку и единый шаблон активности из AAC (компоненты архитектуры Android), мы можем легко сделать наш проигрыватель в приложении видимым на всех экранах, ограничив фрагмент узла навигации так, чтобы он находился над представлением проигрывателя в приложении. Поскольку навигационная структура загружает/выгружает все представления внутри фрагмента узла навигации, мы можем сделать все представления в нашем приложении доступными только для проигрывателя в приложении. Если проигрыватель скрыт, все представления автоматически охватывают его, в противном случае они будут располагаться непосредственно над проигрывателем.
Приятным побочным эффектом использования шаблона одиночной активности является то, что сам плеер будет настраиваться из одного места, основной активности, и в сочетании с моделью представления мы можем реализовать плеер, не нарушая принцип DRY. Теперь поговорим о реализации второй функции.
Поведение макета
С тех пор, как появился макет координатора, Android стал намного более гибким с точки зрения анимации и взаимодействия между представлениями. В этом конкретном случае использования все, что мне нужно было сделать, это написать обычный макет ограничения и добавить к нему одну строку:
<androidx.constraintlayout.widget.ConstraintLayout
....
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
Этого было достаточно, чтобы иметь вид, который может располагаться внизу экрана, расширяться и анимировать эти изменения состояния из коробки. Довольно круто, если вы спросите меня. Итак, как выглядит окончательный макет?
<CoordinatorLayout>
<MainContent/>
<InAppPlayer/>
</CoordinatorLayout>
Конечно, все не так просто, не так ли? . Но что, если в нашем приложении есть вкладки и BottomNavigationView? Наш встроенный в приложение проигрыватель, конечно же, должен располагаться над BottomNavigationView, но ниже основного контента. Одним из решений этого пограничного случая является размещение основного содержимого над представлением нижних вкладок с использованием макета ограничения.
Принцип DRY и ViewModel
Поскольку проигрыватель существует на нескольких экранах (фрагментах), нам нужна модель представления, чтобы сгруппировать все функции проигрывателя в одном месте и просто повторно использовать модель представления во всех представлениях. Какой лучший способ реализовать это, чем использовать класс AAC ViewModel. Мы можем легко разделить эту модель представления между фрагментами и постоянно синхронизировать пользовательский интерфейс игрока. PlayerViewModel может получать данные из класса PodcastRepository, который будет выполнять сетевые вызовы или читать из локальной базы данных.
Пожалуйста, обратитесь к этому Ссылка на GitHub для кода.
Ждите следующей статьи из этой серии!