Ящик для навигации с криволинейным краем в 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.png]()
![crop_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>