Перемещение основного содержимого, чтобы открыть ящик

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

То, как движется основной вид, совпадает с тем, что может быть достигнуто здесь.

Как перемещать основной контент с помощью Layer 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>

Все идеально, за исключением того, что id/tv2 (или другие элементы на этом слое) не могут быть нажаты, когда открыт "выдвижной ящик".

Я пробовал:

1) Создание макетов выше не clickable (drawer_layout, content_frame и left_drawer setClickable (false) без эффекта).

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

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

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

+3
источник поделиться
1 ответ

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

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

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

<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 s, основной бит находится в методе ActionBarDrawerToggle onDrawerSlide():

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 повторного создания, поэтому вам может понадобиться учитывать это, например, во время изменений ориентации и т.д.

+6
источник

Посмотрите другие вопросы по метке или Задайте вопрос