如何使用可见句柄实现DrawerLayout

时间:2013-07-26 14:38:29

标签: android android-layout navigation-drawer drawerlayout

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

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

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

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

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

已关闭状态:

enter image description here

开放状态

enter image description here

我尝试将按钮添加到左侧抽屉的布局中,但似乎您无法将内容显示在其边界之外,并且当您关闭抽屉时,抽屉将始终完全隐藏。

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

任何帮助将不胜感激。

我正在使用支持库(v4)

[编辑] 我支持API级别8 ...因此无法使用ImageView.setTranslationXView.OnAttachStateChangeListener

2 个答案:

答案 0 :(得分: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 here

可以使用

编辑2 :对于那些无法获得句柄的人,请使用mDrawerToggle.setVerticalPostionOffset(0)

答案 1 :(得分: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/