Android sidebar, например, facebook или firefox

С новым приложением facebook у него есть скрытая боковая панель, которую я бы хотел использовать в своих приложениях. Это похоже на боковые панели, которые есть в firefox mobile …

Есть ли у вас какие-либо идеи о том, как реализовать его, помимо повторной реализации ViewPager? Я попытался с HorizontalScrollView, но это также приведет к его повторной реализации …

Я не вижу другого способа, кроме этих двух … каких-либо предложений?

заранее спасибо

Solutions Collecting From Web of "Android sidebar, например, facebook или firefox"

Я придумал решение … Я не знаю, прекрасно ли это, но он работает хорошо.

Итак, что я сделал, это единственный FrameLayout с обоими макетами, сложенными вместе, а затем я просто анимировал верхний макет, чтобы скользить вправо от экрана (просто нужно вызвать слайд-шоу или scrollBy. И в основном это так! Очень просто и эффективно ! (Код, хотя и не очень красивый: P)

РЕДАКТИРОВАТЬ:

Некоторые примеры кода.

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFF" > <include android:id="@+id/menu_layout" layout="@layout/menu_list" android:visibility="invisible"/> <include android:id="@+id/news_list_parent" layout="@layout/main_news_list" /> </FrameLayout> 

Это макет xml, довольно simpe. Включенный .xml – простые LinearLayouts с заголовком и списком.

«Магия» происходит в анимации:

 protected void applyTransformation(float interpolatedTime, Transformation t) { int newOffset; if(expanded) { newOffset = 0; newOffset = (int)(endOffset*(1-interpolatedTime)); } else { newOffset = (int)(endOffset*(interpolatedTime)); } view.scrollTo(-newOffset, 0); } 

EndOffset – целевое движение. Я установил его перед тем, как начать анимацию, и View, который я хочу оживить (в данном случае это представление с id = news_list_parent), он установлен в конструкторе.

Но просто чтобы понять, как это работает, кнопка и ее слушатель будут делать что-то вроде этого:

 if(viewBeneath.getVisibility() == View.INVISIBLE) { viewBeneath.setVisibility(View.Visible); viewToSlide.slideTo(-(width-50), 0); } 

И, наконец, переопределите кнопку «Назад», чтобы сделать противоположную кнопку

 if(viewBeneath.getVisibility() == View.VISIBLE) { viewToSlide.slideTo(0, 0); viewBeneath.setVisibility(View.Visible); } 

Прочитайте это как псевдокод =) Это то, что я сделал в начале, этот код потерян: P

Вы можете попробовать это. Хороший пример. Проверьте класс слайдера ..

https://github.com/gitgrimbo/android-sliding-menu-demo

Я сделал что-то вроде ниже: Введите описание изображения здесь

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

Ниже мой код для чего-то вроде панели меню facebook

  1. Я помещал 2 вида перекрытия в макет кадра. Вид снизу – это меню, верхний вид – это тело содержимого.
  2. И я поместил тело контента в горизонтальный вид прокрутки. Я также посмотрел слева от тела контента в горизонтальном представлении прокрутки. И установите фон представления прозрачным.
  3. Затем прокрутите до содержимого тела при начале. Таким образом, панель меню запрещена телом содержимого.
  4. Когда вы нажимаете кнопку, чтобы отобразить меню, я просматриваю горизонтальный вид прокрутки, чтобы показать прозрачный заполнитель. Тогда меню появится, так как оно находится под прозрачным заполнителем.

Я не использовал XML для интерфейса. Я создаю все в приведенном ниже коде. Я думаю, что это должно быть легко читать и вкладывать в ваше затмение.

 package com.chaoshen.androidstudy.facebooklikesidemenubar; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.FrameLayout; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends Activity{ private boolean Menu_Displayed=false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Display display = getWindowManager().getDefaultDisplay(); final int width = display.getWidth(); // menu: LinearLayout li_menu = new LinearLayout(this); li_menu.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); li_menu.setOrientation(1);//1 is vertical li_menu.setBackgroundColor(Color.GREEN); Button btn1 = new Button(this); btn1.setText("button 1"); btn1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); li_menu.addView(btn1); //body: final HorizontalScrollView hsv = new HorizontalScrollView(this){ @Override // do not let hsv consume the click itself. Then the view under the hsv will also consume the click //so that the menu will be clicked //when menu is not showed up, let hsv be the only view to consume the click. //so that the menu will not be clicked public boolean onTouchEvent(MotionEvent ev) { if(Menu_Displayed){ return false; } else{ return true; } } }; hsv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); hsv.setBackgroundColor(Color.TRANSPARENT); hsv.setHorizontalFadingEdgeEnabled(false); hsv.setVerticalFadingEdgeEnabled(false); final LinearLayout li_body = new LinearLayout(this); li_body.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT)); li_body.setOrientation(0);//0 is horizantal li_body.setBackgroundColor(Color.TRANSPARENT); hsv.addView(li_body); //body: place holder transparent TextView placeholder = new TextView(this); placeholder.setTextColor(Color.TRANSPARENT); placeholder.setLayoutParams(new LayoutParams(width-100, LayoutParams.FILL_PARENT)); placeholder.setVisibility(View.INVISIBLE); li_body.addView(placeholder); //body: real content LinearLayout li_content = new LinearLayout(this); li_content.setLayoutParams(new LayoutParams(width, LayoutParams.FILL_PARENT)); li_content.setOrientation(1);//1 is vertical li_content.setBackgroundColor(Color.CYAN); TextView tv1 = new TextView(this); tv1.setText("txt 1"); tv1.setTextSize(40); tv1.setTextColor(Color.BLACK); TextView tv2 = new TextView(this); tv2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); tv2.setTextSize(50); tv2.setText("txt 2"); tv2.setTextColor(Color.WHITE); //use this button to scroll Button btn_showMenu = new Button(this); btn_showMenu.setText("Menu"); btn_showMenu.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); btn_showMenu.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { hsv.post(new Runnable() { @Override public void run() { if(Menu_Displayed){ hsv.smoothScrollTo(width-100, 0); } else{ hsv.smoothScrollTo(0, 0); } Menu_Displayed = !Menu_Displayed; } }); } }); li_content.addView(tv1); li_content.addView(tv2); li_content.addView(btn_showMenu); li_body.addView(li_content); //add menu and body in to frame FrameLayout mainFrame = new FrameLayout(this); mainFrame.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); mainFrame.addView(li_menu); mainFrame.addView(hsv); //scroll to the body real content to block the menu hsv.post(new Runnable() { @Override public void run() { hsv.scrollBy(width-100, 0); } }); setContentView(mainFrame); } } 

Я также создал собственное решение для этого, так как многие запатентованные решения, похоже, не работали на более старой версии Android или не получили правильных инструкций о том, как заставить его работать.

Мое решение имеет следующие функции:

  • Предоставляет поддержку для сползания представления, чтобы открыть меню, находящееся под ним
  • Меню может быть любым пользовательским представлением
  • Представленный выше вид может представлять собой любой пользовательский вид, а также
  • Поддерживается на старых версиях Android (протестировано для работы хотя бы на Android 2.2)

В решении используется настраиваемый макет, называемый SlidingMenuLayout , который, как ожидается, должен добавить 2 вида. Первое представление, которое вы добавляете, – это меню, второе – основное.

Самый простой способ добавить макет к существующему проекту – переопределить метод setContentView() вашей Activity:

 @Override public void setContentView(View view) { SlidingMenuLayout layout = new SlidingMenuLayout(this); layout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0.0F)); layout.addView(new MenuView(this)); layout.addView(view); super.setContentView(layout); } 

В этом примере MenuView – это представление, которое фактически отобразит меню. Это зависит от вас, чтобы реализовать это представление.

Наконец, вы можете добавить кнопку (обычно в верхнем левом углу основного вида), которая вызывает openMenu() или closeMenu() на соответствующем макете.

Код для SlidingMenuLayout находится на странице проекта GitHub: