Разработка
Продвинутые формы для ваших Drawable
Я хотел бы показать вам новые классы, которые могут помочь вам создать свои уникальные формы и позволить системе соответствующим образом генерировать тени.
Material Design — очень популярная система дизайна, хорошо известная в мире Android.
Материальный дизайн вдохновлен физическим миром и его текстурами, в том числе тем, как они отражают свет и отбрасывают тени. Материальные поверхности переосмысливают такие среды, как бумага и чернила.
После своего первого выпуска в 2014 году он постоянно обновлялся современными и свежими рекомендациями. Чтобы помочь разработчикам Android создавать привлекательный пользовательский интерфейс, инженеры Google выпустили очень популярный набор компонентов под названием Material Components для Android.
Формы
Распространенным шаблоном проектирования является включение содержимого в контейнер. Это может быть карточка или любой другой макет с цветным фоном.
Android-приложения часто используют для этой цели популярный компонент CardView, а в других есть растровые изображения, 9-patch битмапы, векторы и многие другие типы графических элементов.
В физическом мире объекты могут складываться или прикрепляться друг к другу, но не могут проходить друг через друга. Они отбрасывают тени и отражают свет.
Все эти решения прекрасно работают до тех пор, пока вы не начнете работать с высотами и z-трансляциями, потому что Android не может автоматически рисовать тень, соответствующую вашей пользовательской форме.
По этой причине я хотел бы показать вам новые классы, которые могут помочь вам создать свои уникальные формы и позволить системе соответствующим образом генерировать тени.
MaterialShapeDrawable и ShapeAppearanceModel
MaterialShapeDrawable — это специальный Drawable, который обрабатывает тени, высоту, масштаб и цвет для сгенерированного пути.
Путь определяется в модели ShapeAppearanceModel, которая позволяет определить внешний вид всех углов и краев вашей фигуры.
Путь края рисуется классом EdgeTreatment.
Давайте создадим форму. В этом примере мы создадим фигуру, представляющую билет:
Прежде всего, вам нужно настроить ваш проект. Просто добавьте зависимость от материальных компонентов:
dependencies { // ... implementation 'com.google.android.material:material:<version>' // ... }
Теперь пришло время создать новый класс, который будет рисовать типичную форму билета.
class TicketEdgeTreatment( | |
private val size: Float | |
): EdgeTreatment() { | |
override fun getEdgePath( | |
length: Float, | |
center: Float, | |
interpolation: Float, | |
shapePath: ShapePath | |
) { | |
val circleRadius = size * interpolation | |
shapePath.lineTo(center - circleRadius, 0f) | |
shapePath.addArc( | |
center - circleRadius, -circleRadius, | |
center + circleRadius, circleRadius, | |
180f, | |
-180f | |
) | |
shapePath.lineTo(length, 0f) | |
} | |
} |
Для этого мы расширим класс EdgeTreatment и нарисуем внутреннюю дугу.
val ticketShapePathModel = ShapeAppearanceModel | |
.Builder() | |
.setAllCorners(CornerFamily.ROUNDED, 36f) | |
.setLeftEdge(TicketEdgeTreatment(36f)) | |
.setRightEdge(TicketEdgeTreatment(36f)) | |
.build() | |
class TicketDrawable : MaterialShapeDrawable(ticketShapePathModel) |
Как видите, у объекта shapePath есть методы для рисования линий и кривых. Получив EdgeTreatment, мы можем создать ShapeAppearanceModel, настроив левый и правый края.
val ticketShapePathModel = ShapeAppearanceModel | |
.Builder() | |
.setAllCorners(CornerFamily.ROUNDED, 36f) | |
.setLeftEdge(TicketEdgeTreatment(36f)) | |
.setRightEdge(TicketEdgeTreatment(36f)) | |
.build() | |
class TicketDrawable : MaterialShapeDrawable(ticketShapePathModel) |
Теперь вы можете применить этот drawable программно. Дополнительный шаг, который я предлагаю — сделать его доступным также для макетов xml.
<?xml version="1.0" encoding="utf-8"?> | |
<drawable xmlns:android="http://schemas.android.com/apk/res/android" | |
class="me.giacoppo.shapes.TicketDrawable"> | |
</drawable> |
Теперь вы можете просто применить его таким образом:
... android:background="@drawable/bg_ticket" ...
Готово! Ваш компонент готов к использованию в вашем приложении.
Вот еще примеры того, что вы могли бы сделать:
-
Видео и подкасты для разработчиков4 недели назад
Как устроена мобильная архитектура. Интервью с тех. лидером юнита «Mobile Architecture» из AvitoTech
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2025.10
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.11
-
Видео и подкасты для разработчиков2 недели назад
Javascript для бэкенда – отличная идея: Node.js, NPM, Typescript