2015-11-07 5 views
2

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

Путь основные вид движения является то же самое, что может быть достигнуто здесь

How to move main content with Drawer Layout left side

, но в моем случае я хочу, чтобы «ящик», чтобы остаться статически под основным видом.

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

<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/whole_frame" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<!-- everything here is now the new "drawer" --> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="BOO I am hiding!" 
    android:id="@+id/tv2" 
    android:layout_gravity="left|top" /> 
<!-- /everything here is now the new "drawer" --> 

<android.support.v4.widget.DrawerLayout 

android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 

<!-- The This is the main content frame --> 
<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/colorPrimary"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="MOOOOOO!" 
     android:id="@+id/textView" 
     android:layout_gravity="left|top" /> 
</FrameLayout> 


<!-- The see-through navigation drawer --> 
<RelativeLayout 
    android:layout_width="280dp" 
    android:layout_height="match_parent" 
    android:id="@+id/left_drawer" 
    android:clickable="false" 
    android:background="@drawable/transparent_bg" <!-- #00FFFFFF --> 
    android:layout_gravity="start"> 

</RelativeLayout> 

</android.support.v4.widget.DrawerLayout> 

Все отлично, за исключением того ид/TV2 (или других элементов на этом слое) не являются интерактивными, когда «ящик» открыт.

Я пробовал:

1) Изготовление макетов выше, не интерактивный (drawer_layout, content_frame и left_drawer setClickable (ложный) без эффекта).

2) Код в приведенной выше ссылке перемещает content_frame по оси X, а не drawyer_layout - я попытался перемещать drawer_layout вместо кадра - это не работает должным образом, поскольку вы больше не можете нажимать на крайнее право снова закройте ящик.

3) Изменение андроида: layout_width от drawer_layout до fill_parent, но это все еще проблема, поскольку это не тот слой, который перемещается с пути.

Я предполагаю, что DrawerLayout (android.support.v4.widget.DrawerLayout) не должен быть выше другого макета, и мне, возможно, потребуется создать свой собственный ящик для достижения желаемого эффекта - любые идеи или предложения будут замечательными ,

ответ

3

Я считаю, что я разработал относительно простое решение. Следующая настройка DrawerLayout довольно стандартная, т. Е. Содержимое ViewGroup, сначала ящик View, используя стандартные атрибуты и т. Д. Кроме того, для перемещения содержимого с помощью ящика используется техника, аналогичная той, что показана в вашей размещенной ссылке.

Трюк в примере - это установка самого ящика. Мы собираемся использовать два вложенных ViewGroup s - внешний - обычный скользящий выдвижной ящик View; внутренний, ViewGroup для фактического содержимого ящика. Затем мы сдвинем внутренний контент ViewGroup напротив направления слайдера выдвижного ящика, используя DrawerListener (ActionBarDrawerToggle в нашем примере), что делает выдвижной ящик неподвижным с левой стороны.

Пример: DrawerLayout, main.xml.Обратите внимание на стандартные атрибуты ящика, установленные на drawer_containerViewGroup:

<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"> 

    <FrameLayout 
     android:id="@+id/main_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#cccccc" /> 

    <FrameLayout 
     android:id="@+id/drawer_container" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start"> 

     <LinearLayout 
      android:id="@+id/drawer_content" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

      <ImageView 
       android:id="@+id/image" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:src="@drawable/ic_launcher" /> 

      ... 

     </LinearLayout> 

    </FrameLayout> 

</android.support.v4.widget.DrawerLayout> 

Этот пример Activity показывает несколько дополнительных строк нам нужно добавить к обычной установке панели навигации. Кроме получения ссылки на View с, основным битом в onDrawerSlide() методы ActionBarDrawerToggle «s:

public class MainActivity extends Activity { 

    ActionBarDrawerToggle toggle; 
    DrawerLayout drawerLayout; 
    View drawerContainer; 
    View drawerContent; 
    View mainContent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawerContainer = findViewById(R.id.drawer_container); 
     drawerContent = findViewById(R.id.drawer_content); 
     mainContent = findViewById(R.id.main_content); 

     toggle = new ActionBarDrawerToggle(...) { 
      @Override 
      public void onDrawerSlide(View drawer, float slideOffset) { 
       super.onDrawerSlide(drawer, slideOffset); 

       drawerContent.setTranslationX(drawerContainer.getWidth() * (1 - slideOffset)); 
       mainContent.setTranslationX(drawerContainer.getWidth() * slideOffset); 
      } 
     }; 

     drawerLayout.addDrawerListener(toggle); 
    } 
} 

Имейте в виде, что DrawerLayout восстанавливает ящик открыт/закрытое состояние во время Activity воссоздания, так что вам, возможно, потребуется для учета этого, например, при изменении ориентации и т. д.

+1

Ваш ответ велик во многих отношениях, спасибо большое! – mogoman

+1

Нет пота. Это было весело. Ура! –

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