32

我已经成功地为我的应用程序实现了 NavigationDrawer。

我的应用程序显示一个在屏幕左侧打开的抽屉。

我的问题是我需要在左侧添加一个按钮。可以单击或滑动该按钮以打开左侧抽屉。我能做到的。

但是按钮应该看起来像是抽屉的一部分,会溢出到屏幕上。

这意味着按钮应该在抽屉打开和关闭时同时滑动。

关闭状态:

在此处输入图像描述

开启状态

在此处输入图像描述

我尝试将按钮添加到左侧抽屉的布局中,但似乎你不能让东西出现在它的边界之外,而且当你关闭它时,抽屉总是会完全隐藏起来。

现在我正在尝试添加它以向主 DrawerLayout 添加一个按钮,并使其与左侧抽屉的右侧对齐......但没有运气......看起来 DrawerLayout 不能有两个以上的孩子...... .

任何帮助将不胜感激。

我正在使用支持库 (v4)

[编辑] 而且我支持 API 级别 8...所以不能使用ImageView.setTranslationXView.OnAttachStateChangeListener

4

2 回答 2

12

这很棘手。

我认为这类似于在新的谷歌地图应用程序中对抽屉手柄所做的事情。不要相信我的话,不确定。:)

我已经编写了保持在Activity内容视图边缘的切换。当DrawerLayout拖动 时,我将 x 轴上的视图平移了最小子项(即DrawerLayout内容视图)减去阴影(如果有)的数量。由于阴影投射+内容视图DrawerLayout给出了整个抽屉的完整测量宽度。

我迅速将滑动的偏移量和最小的孩子相乘并找到 x 平移。

[编辑:为了便于阅读,代码已被删除,并已移至下面提供的链接]

在您的活动中:

mDrawerToggle = new DrawerLayoutEdgeToggle(
    this, 
    mDrawerLayout, 
    R.drawable.ic_launcher, 
    R.drawable.ic_launcher,
    Gravity.LEFT, 
    true) {

        @Override
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view); //must call super
        }

        @Override
        public void onDrawerOpened(View view) {
            super.onDrawerOpened(view); //must call super
        }

        @Override
        public void onDrawerSlide(View view, float slideOffset) {
            super.onDrawerSlide(view, slideOffset); //must call super

        }
    };
mDrawerLayout.setDrawerListener(mDrawerToggle);

创造力提升: 您可以添加更多装饰物,例如与 ActionBar 的距离,您可以将其设置为手柄的边距。

您也可以通过在 Y 轴上平移沿左/右上下移动手柄来模拟“单拉链效果”。:)

编辑:它可以在我的GitHub 上找到

编辑2:对于那些无法在开头出现句柄的人,只需使用mDrawerToggle.setVerticalPostionOffset(0)

于 2013-08-19T03:15:37.807 回答
6

多亏了 Mobistry 编写的 Aniqroid 库(SO 伪),我找到了一种很容易做到这一点的方法

我使用 SlidingTray 类,它是 android SlidingDrawer 的副本,但可以让您将抽屉定位到屏幕的任何角落。

我通过 xml 声明了元素

<com.sileria.android.view.SlidingTray 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer"
    android:layout_width="match_parent"
    android:layout_height="270dp"
    android:content="@+id/content"
    android:handle="@+id/handle" >

    <ImageView
        android:id="@+id/handle"
        android:layout_width="320dp"
        android:layout_height="24dp"
        android:background="@drawable/tray_btn" />

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="fill_vertical"
        android:orientation="vertical" >
    </LinearLayout>

</com.sileria.android.view.SlidingTray>

只需要打电话

Kit.init(this);

在我的主要Activity布局膨胀之前。

我感谢aniqroid 开发人员!

https://code.google.com/p/aniqroid/

于 2013-08-26T07:31:46.917 回答