如何使用可见句柄实现 DrawerLayout

Posted

技术标签:

【中文标题】如何使用可见句柄实现 DrawerLayout【英文标题】:How to implement a DrawerLayout with a visible handle 【发布时间】:2013-07-26 21:30:21 【问题描述】:

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

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

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

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

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

关闭状态:

开业状态

我尝试将按钮添加到左侧抽屉的布局中,但您似乎无法让内容出现在其边界之外,并且当您关闭抽屉时,它总是会完全隐藏。

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

我们将不胜感激。

我正在使用支持库 (v4)

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

【问题讨论】:

你有什么解决办法吗? 我自己(接受)的答案是我选择的解决方案。 【参考方案1】:

这很棘手。

我认为这类似于在新的 Google 地图应用中对抽屉手柄所做的操作。不要相信我的话,不确定。 :)

我已经编写了保持在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)

【讨论】:

非常感谢。我不确定我是否可以调整您的解决方案,因为我需要支持 API 级别 8,正如我在编辑中所写的那样。有什么想法吗?会试试看。 @ArmelLarcier 我一直在努力提供对旧版本 无法让它与您的库一起正常工作,手柄没有显示,但是当触摸屏幕的某些部分时(没有靠近抽屉通常打开的左侧的位置)抽屉确实看起来突然出现。我也不想使用slidingDrawer,因为我觉得小部件真的很慢。最后,仅使用 Nineoldandroids 库,我就可以通过在抽屉旁边放置另一个视图并以与抽屉移动相同的速度为 x 值设置动画来实现所需的结果。 这与 lib 的功能基本相同。当您不设置手柄的垂直位置时,可能会出现一种奇怪的行为。当我有时间时,我会修复它。对于那些遇到这种情况的人,只需使用setVerticalPostionOffset(0) 你能添加一些示例活动吗?处理程序的图标放在哪里?【参考方案2】:

感谢 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_
    android:layout_
    android:content="@+id/content"
    android:handle="@+id/handle" >

    <ImageView
        android:id="@+id/handle"
        android:layout_
        android:layout_
        android:background="@drawable/tray_btn" />

    <LinearLayout
        android:id="@+id/content"
        android:layout_
        android:layout_
        android:gravity="fill_vertical"
        android:orientation="vertical" >
    </LinearLayout>

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

只需要打电话

Kit.init(this);

在我的主要Activity 中,在扩展布局之前。

感谢 aniqroid 开发者!

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

【讨论】:

我在尝试集成这个库时遇到了一堆错误

以上是关于如何使用可见句柄实现 DrawerLayout的主要内容,如果未能解决你的问题,请参考以下文章

使用 DrawerLayout 打开 Activity 时如何消除延迟?

如何使用 Appcompat v7 21、Toolbar 和 DrawerLayout 将 Burger 动画化为箭头

如何使 DrawerLayout 显示在工具栏下方?

如何检测 DrawerLayout 开始打开?

Android 高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问题

Android 使用DrawerLayout快速实现侧滑菜单