Ящик для навигации с криволинейным краем в android

Я сделал разные типы ящиков навигации, такие как Permanent, Persistent Мини-вариант, временный.

Все они представляют собой прямоугольник в форме контура, как показано ниже.

введите описание изображения здесь


Требование. Я хочу создать ящик навигации с изогнутым краем (в правой части).

введите описание изображения здесь

Посмотрим на мой навигатор. вид

 <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:headerLayout и a app:menu. Если я могу изменить родительский NavigationView ребро, то те, что app:headerLayout и app:menu будут отображаться внутри его родительских границ. Я прав?

Изменение android:background не помогло мне.


Как насчет добавления dimen в dimens.xml есть ли какой-либо атрибут, который я могу использовать?

Возможно ли кривая края навигационного ящика (программно или с использованием изображения)?

Если да, то любое руководство будет высоко оценено.

Ответ 1

Наконец, я решил создать библиотеку для этого случая: https://github.com/rom4ek/ArcNavigationView, не стесняйтесь исследовать и использовать ее:) Это основано на Florent Champigny ArcLayout, с некоторыми корректировками, благодаря ему.

Преимущество этой библиотеки lib в том, что она была построена сверху стандартного NavigationView из библиотеки дизайна Android, и вы можете использовать ее как обычно, просто измените имя класса. Надеюсь, скоро будет опубликован в jcenter. Вот несколько скриншотов:

crop_inside.pngcrop_outside.png

Спасибо за идею!:)

Ответ 2

Этот 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() {
  }
});

Ответ 3

По моему мнению, для этого вам нужно будет создать собственный собственный класс, расширяющий ViewGroup (или FrameLayout), как у нас в классе DrawerLayout.

Пример:

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

В вашем пользовательском классе вы можете использовать Canvas и Paint для рисования вашей предпочтительной формы. Вы можете переопределить методы, реализующие его на вашем пути.

Затем вы можете использовать его внутри своей деятельности:

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

В вашем файле activity_file.xml:

<com.yourpackage.MyDrawerLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/my_drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

<!-- .... -->

</com.yourpackage.MyDrawerLayout>