Многие пользователи телеграма я думаю задумывались как же они сделали эту удобную фичу с сдвигиванием экрана вправо для закрытия текущей активити? Я думаю все, ибо это очень удобно, ну прям вообще супер удобно, почему это не ввели в android'e как и в iOS по дефолту я не понимаю, ведь эта фича по сути не так и сложная в реализации и она очень интуитивна и проста в использовании, не надо тянутся каждый раз к кнопке назад в левом верхнем углу, и не надо тянуться к кнопкам в низу экрана, просто смахиваешь в право.
В общем я задался целью найти как такое реализуется и нашел несколько библиотек которые очень даже просто и удобно делают эту фичу, тут я раскажу про одну из них и про имплементацию ее в проект. Опять же, не претендую на гениальность или на что то еще, просто делюсь, мне это явно поможет в будущем, по этому скорее для себя это делаю :) так проще ориентироваться.
Для начала давайте подключим нужную библиотеку в dependencies. Использовать мы будем вот эту библиотеку. Там у них есть пример использования, но тут есть один нюанс, когда вы просто подключите библиотеку и просто будете смахивать, то оно не будет работать так как на видео выше, переход не будет такой же плавный и уезжающий влево, для этого надо добавить пару анимаций в переход между активитями и на закрытие нужно будет заоверрайдить лисенер кнопки назад.
app/build.gradle
Здесь у нас из добавленного это пакет repositories в котором мы указали откуда нам подтягивать файлы библиотеки, и в dependencies — r0adkll:slidableactivity, вот собственно и все что нам нужно добавить.
Дальше давайте напишем анимации для перехода между активити. У нас их будет две, обе будут двигать в правую сторону, но в зависимости от состояния они будут двигаться или с права на лево, либо с лева на право, в зависимости от состояния, если нажимаем назад то одна анимация если переходим на активити то другая. Вот такая красивая магия.
anim/slide_in_right.xml
Как видно мы двигаем по X c права на лево, как бы перекрывая второй активити поверх первой, так как правая дельта, это android:toXDelta = 0. Эту анимацию мы будем использовать для открытия активити. А скорость анимации мы устанавливаем в android:duration, в нашем случае она стоит самая быстрая.
anim/slide_out_right.xml
А этот кусок анимации сдвигает с лева на право, ее мы будем использовать для закрытия. Здесь как вы видите мы наоборот сделали android:fromXDelta = 0 то есть двигать будем теперь не с права на лево, а наоборот.
Дальше нам нужно сделать еще одну штуку, у нас на данном этапе если мы добавим просто этот евент в наш класс активити не будет прозрачной и не будет эфекта что мы сдвигаем вьюху и под ней что-то есть, под ней будет просто белый фон, для того что бы такого небыло надо сделать все вьюхи по умолчанию прозрачными, тогда можно будет добиться эфекта который нам нужен.
styles.xml
Вот прокомментированная часть как раз и есть тем что нам нужно. Вот подготовка закончилась. Теперь нам осталось создать пару активити и бейз класс для них и все, будет готовая красота.
Давайте для начала создадим бейз класс который будет управлять всей этой фигней, в нем у нас будет отслеживаться и клик назад, и метод перехода между активити будет с анимацией и все все все будет.
BaseSwipeToDismissActivity.java
И так что же у нас тут. Для начала мы переопределили в этом классе метод onCreate(), что бы не писать по сотне раз в активити один и тот же код, проще создать один раз в родительском классе этот метод и просто переопределить нужные поля в абстрактных методах. Что я собственно тут и сделал. Я создал метод getLayoutId() который передает в setContentView() — ID леяута который мы хотим отобразить. А метод isActivityDraggable() возвращает состояние активити, надо ли нам ее делать доступной для свайпа или нет, на родительских активити за которыми нету уже других активити я просто убираю эту фичу, и она не закрывается свайпом.
Собственно строчка Slidr.attach(this); и создает эту функцию для свайпа с права на лево для финиша активити.
Так же я переопределил метод onBackPressed(), в нем я переопределил его же super метод, и добавил проверку надо ли нам свайпить активити анимацией или же закрывать стандартной анимацией.
Переопределил метод startActivity(), она у нас принимает контекст и принимает класс на который перейти, и добавляет анимацию перехода.
Ну и собственно два абстрактных метода которые у нас имплементятся в активити после наследия этого класса вместо стандартной AppCompatActivity.
Дальше нам осталось только прописаться в активитях с этим бейз классом и вызвать нужные функции, в моем случае это старт новой активити.
MainActivity.java
В getLayoutId() передали леяут который хотим отобразить. isActivityDraggable() у нас false так как не хотим что бы эта активити свайпалась. onClick() сделали для клика на кнопку.
Вот так будет выглядеть леяут для нашей активити. Там всего лишь одна кнопка.
activity_main.xml
И этой кнопке присвоен android:onClick = onClick метод для отслеживания клика.
Ну а еще нам нужна вторая активити которую мы будем просто открывать по нажатию.
SecondActivity.java
В ней у нас опять же только два наших абстрактных метода из бейз класса. В getLayoutId() передали леяут который отображаем. А isActivityDraggable() мы сделали true так как хотим что бы эта активити свайпилась.
activity_second.xml
Просто текствьюха с текстом Hello!.. Этого думаю достаточно для примера.
Ну и не забываем еще добавить активити в AndroidManifest, а то будем падать как черти.
AndroidManifest.xml
Вот собственно и все. Дальше как всегда пробуем скомпилировать, должно получится как на видео выше. Буду надеятся что кому-то это пригодится, не только мне :)
Исходники:
GitHub
В общем я задался целью найти как такое реализуется и нашел несколько библиотек которые очень даже просто и удобно делают эту фичу, тут я раскажу про одну из них и про имплементацию ее в проект. Опять же, не претендую на гениальность или на что то еще, просто делюсь, мне это явно поможет в будущем, по этому скорее для себя это делаю :) так проще ориентироваться.
Для начала давайте подключим нужную библиотеку в dependencies. Использовать мы будем вот эту библиотеку. Там у них есть пример использования, но тут есть один нюанс, когда вы просто подключите библиотеку и просто будете смахивать, то оно не будет работать так как на видео выше, переход не будет такой же плавный и уезжающий влево, для этого надо добавить пару анимаций в переход между активитями и на закрытие нужно будет заоверрайдить лисенер кнопки назад.
app/build.gradle
Здесь у нас из добавленного это пакет repositories в котором мы указали откуда нам подтягивать файлы библиотеки, и в dependencies — r0adkll:slidableactivity, вот собственно и все что нам нужно добавить.
Дальше давайте напишем анимации для перехода между активити. У нас их будет две, обе будут двигать в правую сторону, но в зависимости от состояния они будут двигаться или с права на лево, либо с лева на право, в зависимости от состояния, если нажимаем назад то одна анимация если переходим на активити то другая. Вот такая красивая магия.
anim/slide_in_right.xml
Как видно мы двигаем по X c права на лево, как бы перекрывая второй активити поверх первой, так как правая дельта, это android:toXDelta = 0. Эту анимацию мы будем использовать для открытия активити. А скорость анимации мы устанавливаем в android:duration, в нашем случае она стоит самая быстрая.
anim/slide_out_right.xml
А этот кусок анимации сдвигает с лева на право, ее мы будем использовать для закрытия. Здесь как вы видите мы наоборот сделали android:fromXDelta = 0 то есть двигать будем теперь не с права на лево, а наоборот.
Дальше нам нужно сделать еще одну штуку, у нас на данном этапе если мы добавим просто этот евент в наш класс активити не будет прозрачной и не будет эфекта что мы сдвигаем вьюху и под ней что-то есть, под ней будет просто белый фон, для того что бы такого небыло надо сделать все вьюхи по умолчанию прозрачными, тогда можно будет добиться эфекта который нам нужен.
styles.xml
Вот прокомментированная часть как раз и есть тем что нам нужно. Вот подготовка закончилась. Теперь нам осталось создать пару активити и бейз класс для них и все, будет готовая красота.
Давайте для начала создадим бейз класс который будет управлять всей этой фигней, в нем у нас будет отслеживаться и клик назад, и метод перехода между активити будет с анимацией и все все все будет.
BaseSwipeToDismissActivity.java
И так что же у нас тут. Для начала мы переопределили в этом классе метод onCreate(), что бы не писать по сотне раз в активити один и тот же код, проще создать один раз в родительском классе этот метод и просто переопределить нужные поля в абстрактных методах. Что я собственно тут и сделал. Я создал метод getLayoutId() который передает в setContentView() — ID леяута который мы хотим отобразить. А метод isActivityDraggable() возвращает состояние активити, надо ли нам ее делать доступной для свайпа или нет, на родительских активити за которыми нету уже других активити я просто убираю эту фичу, и она не закрывается свайпом.
Собственно строчка Slidr.attach(this); и создает эту функцию для свайпа с права на лево для финиша активити.
Так же я переопределил метод onBackPressed(), в нем я переопределил его же super метод, и добавил проверку надо ли нам свайпить активити анимацией или же закрывать стандартной анимацией.
Переопределил метод startActivity(), она у нас принимает контекст и принимает класс на который перейти, и добавляет анимацию перехода.
Ну и собственно два абстрактных метода которые у нас имплементятся в активити после наследия этого класса вместо стандартной AppCompatActivity.
Дальше нам осталось только прописаться в активитях с этим бейз классом и вызвать нужные функции, в моем случае это старт новой активити.
MainActivity.java
В getLayoutId() передали леяут который хотим отобразить. isActivityDraggable() у нас false так как не хотим что бы эта активити свайпалась. onClick() сделали для клика на кнопку.
Вот так будет выглядеть леяут для нашей активити. Там всего лишь одна кнопка.
activity_main.xml
И этой кнопке присвоен android:onClick = onClick метод для отслеживания клика.
Ну а еще нам нужна вторая активити которую мы будем просто открывать по нажатию.
SecondActivity.java
В ней у нас опять же только два наших абстрактных метода из бейз класса. В getLayoutId() передали леяут который отображаем. А isActivityDraggable() мы сделали true так как хотим что бы эта активити свайпилась.
activity_second.xml
Просто текствьюха с текстом Hello!.. Этого думаю достаточно для примера.
Ну и не забываем еще добавить активити в AndroidManifest, а то будем падать как черти.
AndroidManifest.xml
Вот собственно и все. Дальше как всегда пробуем скомпилировать, должно получится как на видео выше. Буду надеятся что кому-то это пригодится, не только мне :)
Исходники:
GitHub
Комментариев нет:
Отправить комментарий