API-интерфейсы Ink Brush предоставляют возможность создавать и настраивать кисти для рисования на холсте.
Создайте кисть
Для создания кисти используйте методы фабрики Brush с именованными аргументами, например, Brush.createWithColorLong() . Этот класс позволяет задавать следующие свойства:
-
family: Стиль кисти, аналогичный шрифту в тексте. Доступные значенияBrushFamilyсм. вStockBrushes. -
color: Цвет кисти. Цвет можно задать с помощьюColorLong. -
size: базовая толщина мазков, создаваемых кистью. -
epsilon: наименьшее расстояние, на котором две точки штриха должны считаться различными, определяющее уровень детализации или точности геометрии штриха.- Более высокие значения упрощают обводку, что приводит к меньшему использованию памяти и более быстрой отрисовке, но может вызвать видимые артефакты, такие как неровные края при увеличении масштаба.
- Более низкие значения позволяют сохранить больше деталей при высококачественном масштабировании, но увеличивают потребление памяти.
- Для прототипирования с масштабом в 1 пиксель хорошей отправной точкой является значение 0,1. Для производственных приложений, поддерживающих различную плотность экрана, используйте единицы измерения, не зависящие от плотности (например, dp), и соответствующим образом корректируйте значение эпсилон.
val redBrush = Brush.createWithColorLong(
family = StockBrushes.pressurePen(),
colorLong = Color.RED.pack(),
size = 5F,
epsilon = 0.1F
)
Изменить свойства кисти
Вы можете создать копию существующей кисти, используя метод copy() . Этот метод позволяет изменять любые свойства кисти.
val blueBrush = redBrush.copy(colorLong = Color.BLUE.pack())
Пользовательские кисти
Хотя StockBrushes предоставляет универсальный набор стандартных кистей, Ink API также предлагает расширенный путь для создания совершенно новых поведений кистей для уникальных художественных эффектов или для репликации определенных существующих кистей для обратной совместимости.
Специальный объект BrushFamily загружается из сериализованного формата. Требуемый формат – двоичная кодировка буфера протокола BrushFamily, сжатая с помощью gzip. Это позволяет загружать и использовать
файлы пользовательских кистей уже сегодня. После десериализации специальный объект BrushFamily можно использовать для создания нового объекта Brush с определенным цветом и размером, как и любое из семейств StockBrushes.
class CustomBrushes(val context: Context) { companion object { private const val TAG = "CustomBrushes" } val brushes by lazy { loadCustomBrushes() } @OptIn(ExperimentalInkCustomBrushApi::class) private fun loadCustomBrushes(): List<CustomBrush> { val brushFiles = mapOf( "Calligraphy" to (R.raw.calligraphy to R.drawable.draw_24px), "Flag Banner" to (R.raw.flag_banner to R.drawable.flag_24px), "Graffiti" to (R.raw.graffiti to R.drawable.format_paint_24px), // ... ) val loadedBrushes = brushFiles.mapNotNull { (name, pair) -> val (resourceId, icon) = pair val brushFamily = context.resources.openRawResource(resourceId).use { inputStream -> BrushFamily.decode(inputStream) } CustomBrush(name, icon, brushFamily.copy(clientBrushFamilyId = name)) } return loadedBrushes } } data class CustomBrush( val name: String, val icon: Int, val brushFamily: BrushFamily )