2014-02-11 5 views
2

Я видел этот шаблон как для приложений Tumblr, так и для Telegram.Проведите, чтобы закончить Образец деятельности

Когда вы находитесь в подробном представлении (поиск хаштага на Tumblr или в разговоре на Telegram) и проведите пальцем слева направо (например, если вы собираетесь вытащить Navigation Drawer), вы можете увидеть предыдущую активность оттуда. Если вы отпустите его, действие будет завершено.

Как это реализовать?

ответ

2

Как любая хорошая визуальная функция, это трюк :-).
Если вы используете средство автоматизации пользовательского интерфейса, чтобы выгрузить содержимое экрана, находясь в середине одного из этих задних слайдов, вы можете увидеть, что «старый фрагмент» на самом деле представляет собой просто просмотр изображения.
Только когда слайд завершен, предыдущий фрагмент/активность выведен из заднего стека. DDMS rules !

+0

Как это можно сделать? Как сделать изображение, которое является снимком экрана предыдущего экрана? –

+0

@AdamKatz не может быть уверен.тем более, что это было давно, но самым простым способом добиться этого было бы получить обратный растровый рисунок за точкой зрения, когда вы остановите предыдущий экран. Звучит очень дорогостоящая память, хотя – Teovald

+0

и мне нужно сложить эти переходы бесконечно, возможно, это не лучший маршрут :( –

11

[Отказ от ответственности: следующая диссертация была написана через час или около того, изучая исходный код Telegram, поэтому она может содержать важные недостатки или ошибки. Не стесняйтесь прокомментировать]

Корпус Telegram выглядит совсем не так, как говорит Теовалд. В случае Telegram это не фиксированное изображение. Вы можете проверить это, например, открыть чат, где кто-то пишет половину разыгрывания. Вы увидите, что как «активность чата», так и «список активности чатов» обновляются в реальном времени, что не могло быть, если эффект был достигнут с использованием статического изображения.

Поскольку Telegram открыт, вы можете взглянуть на его code base, чтобы выяснить, как это делается на самом деле.

После изучения кода на какое-то время, похоже, что они делают не визуальный трюк. Фактически, это трюк, который выходит далеко за рамки небольших обманщиков, чтобы подделать какой-то визуальный эффект. В любом случае, это пахнет некоторыми нестандартными вещами.

Прежде всего, вы можете посмотреть файл манифеста Telegram, чтобы увидеть, что они определяют только три действия (LaunchActivity, IntroActivity и PopupNotificationActivity) ... три действия! Любой, кто пользуется Telegram, согласен с тем, что приложение, как представляется, имеет более трех видов деятельности, поэтому все, что они делают, похоже, что на практике у них есть только одно действие, выполняемое одновременно (LaunchActivity), которое через какой-то механизм показывает разные «действия ».

В самом деле, если вы идете в LaunchActivity вы увидите, что он наследует от так называемого ActionBarActivity, который будет базовым классом для всех реальных деятельности в Телеграмма (хотя на практике только LaunchActivity кажется продлить его). Эта деятельность, по-видимому, позаботится об осуществлении наряду с другими классами панели действий. Да, это означает, что Telegram не использует стандартную панель действий и не определяет какую-либо оболочку для использования «макетной» версии на Android < 11 и реальной версии на Android> = 11. Это довольно скручено, но вы можете иметь посмотрите на их реализацию панели действий (класс ActionBar, а также на другие зависимые классы) и убедитесь, что они буквально создают исходный FrameLayout и встраивают его для эмуляции панели действий. Это означает, среди прочего, что они не раздувают ресурсы XML, чтобы определить панель действий для каждой «активности», вместо этого они заполняют ее вручную. Очень громоздкий и очень нестандартный, который, на мой взгляд, делает вид Telegram слабым в отношении улучшения панели действий в будущих версиях Android.

Теперь, что касается меня больше всего, так это то, что они полностью игнорируют деятельность и систему фрагментов Android, развертывая собственную версию. Если быть точным, это не то, что они вообще игнорируют действия и фрагменты Android, но они используют некоторые методы, которые (по моему скромному мнению) были бы смущены, вероятно, большинством разработчиков Android там.

Если вы посмотрите на ActionBarActivity, вы увидите, что он расширяет обычный Android Activity. Он удаляет (через свою тему, а также программно) стандартную панель действий и название активности в методе onCreate() (это подтверждает, что они используют свою собственную настраиваемую версию панели действий). Но самое главное, они определяют «стек» «фрагментов». «Фрагмент» здесь не тот, который понимают «фрагмент Android», но какая-то странная версия, которую они выкатили, также реализовала концепцию «фрагмент». Они используют класс BaseFragment для определения «фрагмента», который в основном представляет собой класс, который создает свой вид через обратный вызов (как и фрагменты Android), и который определяет некоторые методы «жизненного цикла», такие как onPause() и onFragmentDestroy(). Затем вы можете видеть, что то, что мы будем рассматривать как обычные действия Android, фактически реализуется через этот странный механизм BaseFragment. Например, «чат-активность» реализуется классом ChatActivity, однако это не наследуется от Android Activity, а от BaseFragment.

Итак, подведем итог, что я объяснил до сих пор, телеграмма, кажется, приложение, запущенное единый вид деятельности (LaunchActivity, который, в свою очередь наследуется от ActionBarActivity), который реализует настроенную панель действий и странные рамки «фрагмент», который эмулирует регулярные действия Android, по крайней мере, на визуальном уровне.

Теперь, если вы посмотрите на метод onTouchEvent() класса ActionBarActivity, это, по-видимому, отвечает за реализацию основного алгоритма эффекта «проведите по экрану». Это отслеживает палец пользователя и соответственно перемещает представление поддельного фрагмента. Когда пользователь поднимает палец, если условие отклонения «фрагмента» истинно (backAnimation - неверно), фрагмент удаляется: когда анимация заканчивается, вызывается метод onSlideAnimationEnd(), который затем удаляет «фрагмент» из фрагмент, сохраненный классом ActionBarActivity.

Итак, Telegram выполняет эффект «проведите по экрану», реализуя фанк-систему «фрагментов», в которой то, что кажется Activity, представляет собой необработанное представление, моделируемое подклассом BaseFragment. Это заставляет их развертывать собственную версию панели действий, а также следить за некоторыми очень странными и «нестандартными» технологиями Android.

Я действительно не знал, что Telegram был реализован таким образом, поэтому в настоящий момент я немного разочарован. Я ожидал, что они получат доступ к некоторым скрытым API-интерфейсам Android, что, конечно, было бы неправильным, но, по крайней мере, это было бы не так громоздко и уродливо, как реализация собственной панели действий и системы «фрагментов». Отныне, для меня, код Telegram будет ссылкой на то, что вы никогда не должны делать в Android.

0

Я просто реализовать это, проверить его здесь

SwipeFinishableActivity.

Вообще говоря, вам нужна прозрачная верхняя активность, чтобы при перетаскивании верхней активности вы могли видеть вторую верхнюю часть ниже. И вы должны отслеживать ваше событие касания, чтобы переместить свои представления в своей деятельности.

Смежные вопросы