导航抽屉与android中的curverd边缘

时间:2016-12-26 08:33:23

标签: android layout material-design navigation-drawer

我做过不同的导航抽屉类型,如Permanent,Persistent 迷你变种,临时。

它们的轮廓形状都是矩形,如下所示。

enter image description here

要求:我想创建一个带有弯曲边缘的导航抽屉(在右侧)。

enter image description here

让我们看看我的导航。图

 <android.support.design.widget.NavigationView
            android:background="#FFF"
            android:id="@+id/nav_view"
            android:layout_width="wrap_content" android:layout_height="match_parent"
            android:layout_gravity="start" android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer"/>

它包含app:headerLayoutapp:menu。如果我可以更改父NavigationView个边缘,则app:headerLayoutapp:menu将显示在其父级边界内。我是对的吗?

android:background的更改对我没有用。

如果在dimen中添加dimens.xml,我可以使用哪些属性?

是否可以曲线导航抽屉的边缘(以编程方式或使用图像)?

如果是,任何指导都将受到高度赞赏。

4 个答案:

答案 0 :(得分:7)

最后,我决定为此案例创建库:https://github.com/rom4ek/ArcNavigationView,随意浏览并使用它:)它基于Florent Champigny's ArcLayout,并进行了一些调整,谢谢他。

建议使用这个lib的优点是它是从android设计库中标准NavigationView构建的,你可以照常使用它,只需更改类名即可。希望很快就会在 jcenter 上发布。以下是一些截图:

感谢您的想法! :)

答案 1 :(得分:6)

这个Lib可以帮助你

  

https://github.com/mzule/FantasySlide

如何使用:XML

<com.github.mzule.fantasyslide.FantasyDrawerLayout   xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/drawerLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"
    android:src="@drawable/fake" />// this image is part of home scren 

<com.github.mzule.fantasyslide.SideBar
    android:id="@+id/leftSideBar"
    android:layout_width="200dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/colorPrimary"
    app:maxTranslationX="66dp"> // This attribute is for curve  

    <!--  SideBar  -->

</com.github.mzule.fantasyslide.SideBar>

JAVA:

SideBar leftSideBar = (SideBar) findViewById(R.id.leftSideBar);
leftSideBar.setFantasyListener(new SimpleFantasyListener() {
  @Override
  public boolean onHover(@Nullable View view) {
    return false;
  }

  @Override
  public boolean onSelect(View view) {
     return false;
   }

  @Override
   public void onCancel() {
  }
});

答案 2 :(得分:2)

据我所知,要实现这一点,你必须像在DrawerLayout类中一样创建自己的自定义类,扩展ViewGroup(或FrameLayout)。

EX:

android:scaleType="centerInside"

在自定义类中,您可以使用Canvas和Paint绘制首选形状。您可以覆盖以您的方式实现它的方法。

然后你可以在你的Activity中使用它:

public class DrawerLayout extends ViewGroup implements DrawerLayoutImpl {
/*
..
*/
}

在您的activity_file.xml中:

MyDrawerLayout drawer = (MyDrawerLayout) findViewById(R.id.my_drawer_layout);

答案 3 :(得分:0)

从上面的库中使用它:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />
<com.rom4ek.arcnavigationview.ArcNavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@android:color/white"
    android:fitsSystemWindows="true"
    app:menu="@menu/activity_main_drawer"
    app:itemBackground="@android:color/white"
    app:headerLayout="@layout/nav_header_main"
    app:arc_cropDirection="cropInside"
    app:arc_width="96dp"/>