Сейчас я пишу тестовое приложение, в котором просто тренируюсь создавать всякое. Сегодня вот добила Splash Screen. Есть достаточно много вариантов, но я хотела сделать именно с гифкой. Т.е. пользователь кликает на лаунчер, проигрывается гифка и потом уже открывается стартовая активити.
- Первое и самое главное, что нам нужно → найти красивую анимацию;
- Я выбрала кота, который мигает глазками. Это тестовое приложение, поэтому я особо и не выбирала. Взяла самое симпатичное с первой страницы. Мой выбор можно посмотреть в видео в конце статьи;
- Далее нам понадобится библиотека pl.droidsonroids.gif:android-gif-drawable:${Versions.gif}. Именно она позволяет работать с гифками. Полное описание здесь: https://github.com/koral--/android-gif-drawable
- Подключаем все зависимости и синхронизируем;
- Сохраняем выбранную гифку в папку drawable в проекте;
- Заходим в xml активити, которая будет стартовой и ставим там нашу вьюшку, которая будет отвечать за гиф. Мой код выглядит так:
- Тут всё просто. Единственный вопрос, который может возникнуть, что ещё за scaleType? Он отвечает за то, чтобы наша гифка была на весь экран телефона. Будет не очень симпатично, если при старте гифка будет в левом верхнем углу, а остальной фон будет просто белым.
- В xml всё готово. Переходим в активити и в onCreate создаём гиф. Весь мой код выглядит так:
Что тут происходит:
- LOOP_NUMBER → это количество кругов, которое должна сделать анимация. В моём случае: котик должен мигнуть 5 раз.
- LOOP_NUMBER_LISTENER → Почти аналогично, но мы вычитаем единичку, потому что отсчёт у нас начинается с нуля.
- val gifDrawable = GifDrawable(resources, R.drawable.splash) → создаём объект для гифки и передаём туда гифку, которую чуть выше мы сохранили в папку drawable
- splash.setImageDrawable(gifDrawable) → splash — это id для GifImageView из xml. И в нашу вьюшку мы передаём созданный объект.
- gifDrawable.loopCount = LOOP_NUMBER → тут я установила, что количество кругов для вьюшки — 5. Когда котик мигнёт 5 раз, то анимация должна остановиться. В противном случае котик будет мигать бесконечно долго.
- gifDrawable.addAnimationListener → листенер, в котором можно указать, что делать, когда анимация закончится. И тут важно помнить, что хотя кругов у нас 5, но и полных завершений у анимации тоже 5. Т.е. у нас будет заход внутрь этого метода 5 раз, а не 1 раз. Именно поэтому у меня есть внутри условие if (it == LOOP_NUMBER_LISTENER). Т.е. мне нужно открывать новый экран только в том случае, если текущий круг равен последнему кругу, а не каждый раз.
- homeStarter.start() → это просто открытие другой activity. Вы можете написать любое действие, которое нужно сделать, вместо этой строчки.
- addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) → это надо добавить к интенту при открытии новой активити. Этот флаг нужен, чтобы при нажатии назад снова не открывалась анимация. Будет странно, если пользователь будет на главном экране, нажмёт назад, хотя закрыть приложение, а там, внезапно, снова будет наш Splash Screen.
Ну и по традиции, весь код здесь: https://gitlab.com/Ladgertha/weatherapp/-/tree/splash_screen
P.S. Кстати, заметили как красиво теперь вставлен код? Без картинок и текста. :)