Слайд в стиле Facebook для Android

283

Новое приложение Facebook и его навигация так круты. Я просто пытался увидеть, как это может быть воспроизведено в моем приложении.

У кого-нибудь есть подсказка, как этого можно добиться?

введите описание изображения здесь

При нажатии на верхнюю левую кнопку отображается слайд страницы и следующий экран:

введите описание изображения здесь

YouTube видео

Харша М.В.
источник
2
да, видео также будет полезно, чтобы узнать точный эффект.
bool.dev
@ bool.dev вот видео: youtube.com/watch?v=ANLMaL7zn20
Харша М.В.
@HarshaMV: - Попробуйте поискать эту ветку. Думаю, это может вам чем-то помочь. stackoverflow.com/questions/8453320/…
Shashank_Itmaster
3
Очень хорошая статья о слайд-навигации в Android - androiduipatterns.com/2012/06/… . Должен прочитать.
Алексей Коровянский
Я реализовал свое собственное скользящее меню, смотрите здесь stackoverflow.com/a/15880375/1939564
Мухаммед Бабар

Ответы:

176

Я сам с этим поиграл, и лучший способ, который я смог найти, - это использовать FrameLayout и положить пользовательский HorizontalScrollView (HSV) поверх меню. Внутри HSV находятся ваши приложения Views, но есть прозрачный View как первый дочерний элемент. Это означает, что когда HSV имеет нулевое смещение прокрутки, меню будет отображаться на экране (и все равно будет удивительно активным).

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

Код здесь, и две нижние кнопки (называемые HorzScrollWithListMenu и HorzScrollWithImageMenu) в действии Launch показывают лучшие меню, которые я мог придумать:

Android-слайд-меню демо

Снимок экрана с эмулятора (средняя прокрутка):

Скриншот из эмулятора (средняя прокрутка)

Скриншот с устройства (полная прокрутка). Обратите внимание, что мой значок не такой широкий, как значок меню Facebook, поэтому представление меню и представление «приложение» не выровнены.

Снимок экрана с устройства (полная прокрутка)

Пол Грайм
источник
1
@AmokraneChentir Вы можете использовать различные действия, вызывая getDrawingCache()ваши действия вне меню и создавая ImageView из растрового изображения. Затем вызовите startActivity(intent)& overridePendingTransition(0, 0)в onClickметоде ClickListenerForScrollingкласса, чтобы немедленно показать новое действие и получить желаемый эффект.
Siklab.ph
1
Интересно, может ли пользовательский HorizontalScrollView использовать с ListView, поскольку в официальном документе HorizontalScrollView упоминается, что он заставит ListView отображать все элементы.
Шиами
1
эта вилка переключает актив без использования фрагментов!
Эрик Б
1
Спасибо за вашу помощь, я смог использовать HorzScrollWithListMenu.java.
КаренАнн
2
Большое спасибо @PaulGrime ... это отличный простой пример, и самое удивительное в этом демо - это простой, понятный и легко настраиваемый, и нет проекта библиотеки для использования.
Навин Кумар
37

В этом проекте библиотеки я реализовал слайд-навигацию в стиле Facebook .

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

Внутри репозитория вы можете найти демо-проект, в котором рассказывается, как использовать lib для реализации навигации, подобной Facebook. Вот короткое видео с записью демо-проекта .

Также эта библиотека должна быть совместима с этим шаблоном ActionBar, потому что она основана на транзакциях операций и TranslateAnimations (не на транзакциях фрагментов и пользовательских представлениях).

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

Всего наилучшего,
Алекс

AlexKorovyansky
источник
4
Привет, я только что понял, что ваш подход будет создавать большое растровое изображение скриншота каждый раз, когда вы открываете боковую панель. Это увеличит размер кучи и может вызвать ошибку нехватки памяти.
Шиами
3
Спасибо дорогой Коровянск, это очень приятно. но Абсолютный макет устарел в новых ОС. Можете ли вы перекодировать это снова
Хесам
Спасибо всем, кто дает отзыв в github или здесь. Я знаю о некоторых ошибках и у меня есть идеи, как сделать приложение лучше. Я делаю это, когда у меня будет свободное время.
AlexKorovyansky
Привет короянск. Я использую вашу библиотеку, она хорошо работает. Но у меня есть небольшая проблема. Когда список слайд-баров открыт, я запускаю действие, щелкнув элемент списка. Активность запускается правильно, но анимация скольжения не работает. Код((MenuActivity) getActivity()).getSlideoutHelper().close(); startActivity(new Intent(getActivity(), MyActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra("category", position));
Солнечный
в вашем случае новая активность будет открыта немедленно, не дожидаясь окончания анимации, вы можете попытаться расширить библиотеку и добавить обратный вызов для завершения анимации. может быть, я добавлю эту функцию в следующую версию библиотеки.
AlexKorovyansky
24

Вот еще один библиотека и, кажется, лучшая на мой взгляд. Я не писал это ..

ОБНОВИТЬ:

Этот код, кажется, работает лучше всего для меня, и он перемещает всю панель действий, как приложение G +.

Как Google удалось это сделать? Слайд ActionBar в приложении Android

Патрик
источник
7
Я написал эту библиотеку, рад, что тебе нравится. Пока это действительно просто, но я буду улучшать его в ближайшие недели. Приглашаем других людей также внести изменения в него.
Дэвид Скотт
Эта библиотека абсолютно замечательна. Это так просто в использовании и отлично работает. Спасибо. Я просто хотел бы добавить, что образец работает только с ICS (и я думаю, что Honeycomb) ... но библиотека работает полностью до версии 2.1, я использую ее без проблем.
Стивен Эллиотт
Не плохо, это довольно просто, но работает хорошо, и установка очень быстрая. Однако он не очень настраиваем из-за пределов библиотеки: все элементы имеют одинаковую простую разметку, и на ходу нет возможности динамического перечисления; обе вещи было бы легко адаптировать, но мне действительно нужно группировать внутри списка, и это будет не так просто.
Хтафоя
22

Я думаю, что приложение facebook не написано в нативном коде (я имею в виду нативный код, используя макеты в Android), но они использовали для него webview и использовали некоторые библиотеки javascript ui, такие как sencha . Это может быть легко достигнуто с помощью Sencha Framework.

введите описание изображения здесь

Санджай Кумар
источник
16
+1 Пользовательский интерфейс может быть изменен без обновления приложения, так что это определенно веб-приложение, а приложение для Android в основном веб-браузер.
Руди
7
Я не уверен, что это обязательно так. Скелет для пользовательского интерфейса может быть нативным (например, собственно меню «Вид» и другие нативные представления), а содержимое этих представлений загружается динамически. Если каркас приложения изменится, скорее всего, потребуется обновление.
Пол Грайм
2
Я не думаю, что приложение facebook это веб-приложение. Слишком быстро, быстро. Я знаю веб / гибридные приложения, которые хорошо выглядят "как нативные", но все же есть небольшое отставание по сравнению с нативными. Не только скелет - списки, карта и т. Д. Выглядит и чувствует себя родным. По крайней мере, с современным состоянием техники.
Ixx
Хорошо, кто-то сказал мне, что это приложение не было таким около 2 месяцев - так что вы ссылаетесь на старую версию, которую я не знаю. В любом случае, было бы полезно прокомментировать, что текущее приложение определенно является нативным.
Ixx
20

Вот еще одна (очень хорошая) библиотека с открытым исходным кодом!

Хорошая особенность этого в том, что он легко интегрируется с ActionBarSherlock.

Вот ссылка на проект GitHub

Вот ссылка на скачивание Google Play

dwbrito
источник
2
я думаю, что это лучшее
Харша М.В.
17

Я только что реализовал аналогичное представление для моего собственного проекта. Вы можете проверить это здесь

Вот пример экрана приложения на основе библиотеки, которую я написал: Пример ActionsContentView

Это пользовательское представление легко использовать как элемент макета XML. Вот пример:

    <shared.ui.actionscontentview.ActionsContentView
      android:id="@+id/content"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:actions_layout="@layout/actions"
      app:content_layout="@layout/content" />

Если у вас возникнут какие-либо вопросы по использованию библиотеки ActionsContentView, я могу написать небольшую статью в проектах Wiki.

Некоторые преимущества этой библиотеки:

  • возможность просмотра слайдов одним касанием
  • легко настроить размер панели действий в XML
  • поддержка всех версий Android SDK, начиная с 2.0 и выше

Есть одно ограничение:

  • все горизонтальные виды прокрутки не будут работать в границах этого вида

С наилучшими пожеланиями, Стивен

грубый
источник
как установить первый пользовательский интерфейс в качестве загружаемой картинки? я проверяю это первый пользовательский интерфейс на экране. Я надеюсь, что просмотр списка покажет, когда приложение запускается. через вашу библиотеку 2.0, но ваша демонстрация 4.0, я надеюсь, вы также можете использовать 2.0. это круто
pengwang
@pengwang: я только что добавил код для поддержки этой функции. Вы можете сделать это, пока Activity.onResume (), вызвав viewActionsContentView.showActions ();
грубо
Можно ли отключить сенсорные события на скрытой части? Например, когда активна правая часть, все виды справа отключены.
Валерий
Существует возможность заблокировать макет контента, пока отображается первое действие. Я отправил вам по электронной почте пример проекта.
грубо
16

С версией 13 пакета поддержки Android (май 2013 г.) есть DrawerLayout для создания Навигационного Ящика, который можно вытянуть из края окна. И навигационный ящик - теперь образец дизайна.

библиотека поддержки v4

шаблон дизайна навигационного ящика

Вубао Ли
источник
2
Да, минимальный поддерживаемый уровень API - 4.
Wubao Li
1
А библиотека совместимости позволяет использовать ее на старых устройствах. Я только что разработал один для Gingerbread и позже.
Тони Маро
2
Это должно быть дальше на вершине. Слишком много посторонних сторонних библиотек в других ответах.
Джейсон Аксельсон
15

Сделал обзор существующей реализации и превратил ее в проект библиотеки плюс пример приложения. Также добавлен синтаксический анализ XML, а также автоопределение, возможно, существующей панели действий, поэтому она работает как со встроенной, так и со вспомогательной панелью действий, такой как ActionBarSherlock.

Этот также сдвигает панель действий!

Все это - библиотечный проект вместе с примером приложения, который описан в «Скользящем меню для Android», как приложения Google и Facebook . Спасибо Scirocco за первоначальную идею и код!

SlideMenu на пряники SlideMenu на ICS с ActionBar

bk138
источник
10

Это просто и элегантно: https://github.com/akotoe/android-slide-out-menu.git

Снимок:

введите описание изображения здесь

Эдвард
источник
Вы можете помочь мне?? Вопрос, связанный со слайдером .. Вот ссылка stackoverflow.com/questions/14500927/…
moDev
это позволяет вам скользить, касаясь? (значит, сильно ударил)
alicanbatur
@ Эдвард Я работал с вашим образцом, я думаю, что он великолепен и прост в использовании, но при повороте экрана возникла проблема (я использую android: configChanges = "direction" в манифесте с android 3.1, потому что я этого не делаю хотите, чтобы действие было перезапущено) экран вращается нормально, но структура кадра сохраняет свои размеры и выглядит не очень хорошо, у вас есть способ обойти это? Я перепробовал все, но не могу это исправить. спасибо
zvzej
@ Эдвард, вот мой вопрос, используя ваш образец, пожалуйста, помогите мне или дайте мне совет, спасибо. stackoverflow.com/questions/16778911/…
zvzej
10

Я думаю, что библиотека не упоминается:

jfeinstein10 / SlidingMenu

github url:https://github.com/jfeinstein10/SlidingMenu

  • отлично работает с панелью действий ActionBarSherlock, которая помогает в обратной совместимости !
  • Поддержка правого слайда, а не только слайд с помощью кнопки!
madlymad
источник
8

Пока не могу прокомментировать ответ, данный @Paul Grime, в любом случае я представил в его проекте github исправление проблемы с мерцанием ....

Я выложу исправление здесь, возможно, кому-то это нужно. Вам просто нужно добавить две строки кода. Первый ниже вызова anim.setAnimationListener:

anim.setFillAfter(true);

И второй после вызова app.layout ():

app.clearAnimation();

Надеюсь это поможет :)

Fatal1ty2787
источник
6

Я реализовал это с AbsoluteLayout и простым контроллером слайдов, который перемещает представление в отрицательное смещение, чтобы скрыть.

Если кому-то интересно, могу почистить код / ​​макет и выложить. Я знаю, что AbsoluteLayout устарела, но это была очень прямолинейная реализация. Вид слева / Вид справа, и, когда «открываешься скольжением», просто переместите вид слева от смещения -X на ширину устройства - все, что вы хотите показать на правом просмотре

Богатый
источник
Я буду признателен, если вы можете сделать это без AbsoluteLayout! Спасибо!
Игорь
4

Здравствуйте, это лучший пример демонстрационного приложения, которое предоставляет слайд-меню на Facebook. Проверьте код здесь

введите описание изображения здесь

введите описание изображения здесь

Мукеш Й
источник
3

Как часть моей общей библиотеки Android (ACL) я реализовал собственный SideBar. Основные преимущества:

  1. Боковую панель можно установить в любую позицию: слева, сверху, снизу, справа
  2. Как основной вид, так и скользящий вид кликабельны
  3. Боковая панель может быть частично показана
  4. Стилируемые атрибуты для SideBar упрощают изменение его стиля
  5. Артефакт в репо Maven
  6. Часть большой библиотеки

Исходный код: https://github.com/serso/android-common/tree/master/views/src/main/java/org/solovyev/android/view/sidebar

Использование: https://github.com/serso/android-common/blob/master/samples/res/layout/acl_view_layout.xml

se.solovyev
источник
3

Недавно я работал над версией моего скользящего меню. Он использует популярную Android-библиотеку J.Feinstein SlidingMenu.

Пожалуйста, проверьте исходный код на GitHub:

https://github.com/baruckis/Android-SlidingMenuImplementation

Загрузите приложение прямо на устройство, чтобы попробовать:

https://play.google.com/store/apps/details?id=com.baruckis.SlidingMenuImplementation

Код должен быть понятен из-за комментариев. Надеюсь это будет полезно! ;)

Андрюс Барукис
источник
3

Я нашел самый простой способ для этого и его работы. Используйте простой навигационный ящик и вызовите box.setdrawerListner () и используйте метод mainView.setX () в методе hookSlide ниже или скопируйте мой код.

XML-файл

 <android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" >

<RelativeLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">

  <ImageView
      android:layout_width="40dp"
      android:layout_height="40dp"
      android:id="@+id/menu"
      android:layout_alignParentTop="true"
      android:layout_alignParentLeft="true"
      android:layout_marginTop="10dp"
      android:layout_marginLeft="10dp"
      android:src="@drawable/black_line"
      />
</RelativeLayout>


<RelativeLayout
    android:id="@+id/left_drawer"
    android:layout_width="200dp"
    android:background="#181D21"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    >
    </RelativeLayout>
 </android.support.v4.widget.DrawerLayout>

Java-файл

   public class MainActivity extends AppCompatActivity {
DrawerLayout drawerLayout;
RelativeLayout mainView;
ImageView menu;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    menu=(ImageView)findViewById(R.id.menu);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mainView=(RelativeLayout)findViewById(R.id.content_frame);

    menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            drawerLayout.openDrawer(Gravity.LEFT);
        }
    });

    drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            mainView.setX(slideOffset * 300);
        }

        @Override
        public void onDrawerOpened(View drawerView) {

        }

        @Override
        public void onDrawerClosed(View drawerView) {

        }

        @Override
        public void onDrawerStateChanged(int newState) {

        }
    });
 }
}

введите описание изображения здесь

Спасибо

Дальвиндер Сингх
источник
2

Я собираюсь сделать некоторые смелые догадки здесь ...

Я предполагаю, что у них есть макет, который представляет меню, которое не видно. При нажатии кнопки меню они анимируют макет / вид сверху, чтобы убрать его с дороги, и просто обеспечивают видимость макета меню. Я не думал о том, чтобы это вызывало какие-либо проблемы с z-индексами в представлениях или как они это контролируют.

jlindenbaum
источник
если вы использовали приложение ... вы можете увидеть, что макет сдвигается вправо, уступая место разделу меню. Я постараюсь сделать видео и загрузить его.
Харша М.В.
1
Я использую версию для iPhone, если версия для Android такая же, то я сомневаюсь, что это сильно отличается от того, что я описал. Я не написал много анимаций на Android, поэтому я не мог сказать вам, как выглядит код анимации, но, грубо говоря, я предполагаю, что это то, что я описал.
jlindenbaum
спасибо, youtube.com/watch?v=ANLMaL7zn20 - это тот же эффект на iPhone.
Харша М.В.
2

Вот руководство по проектированию и разработке, найденное в официальной документации Android, без необходимости добавлять неофициальную внешнюю библиотеку. Подойдет только библиотека поддержки Android. Найдите ссылки здесь.

проектировать и развивать .

jai_b
источник
1

Android-приложение Facebook возможно построено из фрагментов . Меню - это один фрагмент, а углубленное действие (лента новостей / события / друзья и т. Д.) - это другой фрагмент. В основном макет планшета «Master & Detail» на телефоне.

Гуннар Карлссон
источник
В этом случае нам нужно создать панель действий внутри фрагмента, поэтому мы не можем использовать какие-либо функции платформы Android для ее создания, верно? На самом деле я не могу быть уверен насчет Facebook, но для многих разработчиков это слишком сложный способ сделать actionbar без помощи фреймворка, надеюсь, это время уже прошло.
AlexKorovyansky
1

Для информации: поскольку библиотека совместимости начинается с версии 1.6, а это приложение для Facebook также работает на устройствах с Android 1.5, это невозможно сделать с помощью фрагментов.

Это можно сделать следующим образом: создайте «базовое» действие BaseMenuActivity, в которое вы поместите всю логику для onItemClickListener для списка меню и определите 2 анимации («открыть» и «закрыть»). В конце / начале анимации вы показываете / скрываете макет BaseMenuActivity (назовем его menu_layout). Макет для этого действия прост, это только список с элементами + прозрачная часть справа от вашего списка. Эта часть будет кликабельной, и ее ширина будет равна ширине вашей кнопки перемещения. С этим вы сможете нажать на этот макет, чтобы запустить анимацию, чтобы content_layout скользил влево и занимал весь экран. Для каждого параметра (т. Е. Элемента списка меню) вы создаете «ContentActivity», которое расширяет BaseMenuActivity. Затем, когда вы нажимаете на элемент списка, вы запускаете ItemSelectedContentActivity с видимым меню (которое вы закроете, как только начнете свою деятельность). Макеты для каждого ContentActivity являются FrameLayout и включают в себя и. Вам просто нужно переместить content_layout и сделать menu_layout видимым, когда вы хотите.

Это способ сделать это, и я надеюсь, что я достаточно ясно.

p4u144
источник
1

Я играл с этим последние несколько дней, и я придумал решение, которое довольно просто в конце концов, и которое работает до Honeycomb. Мое решение состояло в том, чтобы анимировать вид, который я хочу скользить ( FrameLayoutдля меня), и прослушивать конец анимации (в какой момент сместить левую / правую позицию вида). Я вставил свое решение здесь: Как оживить перевод View

Адиль Хуссейн
источник
1

После нескольких часов поиска я обнаружил, что решение Пола Грайма, вероятно, является лучшим. Но в нем слишком много функциональности. Так что это может быть трудно учиться для начинающих. Итак, я хотел бы представить свою реализацию, основанную на идее Пола, но она более проста и должна легко читаться.

реализация боковой панели меню с использованием кода Java без XML

Chao
источник
1

Я не видел ни одного удивительного SimonVT / android-menudrawer, упомянутого выше в ответах. Так вот ссылка

https://github.com/SimonVT/android-menudrawer

Его очень легко использовать, и вы можете положить его слева, справа, сверху или снизу. Очень хорошо документировано с примером кода и лицензией Apache 2.0.

lwegener
источник
0

В июне 2012 года Google добавил «шаблоны» в плагин Eclipse ADT , и есть шаблон, называемый «поток основных / подробных данных», который делает именно это (на основе фрагментов)

выстр
источник
1
Основной / подробный поток не рассматривается как боковое меню. Это просто два фрагмента, отображаемых вместе (планшет) или отдельно (телефон).
Tomash
Что ж, в июне 2013 года был добавлен макет «Навигационный ящик», что больше похоже на то, что нужно здесь, но панель действий не будет скользить с выдвижным ящиком, так как здесь нужна ползунок в стиле Facebook.
Куля Сим Сим