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 загружается из сериализованного формата. Требуемый формат — это сжатый в формате gzip двоичный код буфера протокола BrushFamily . Это позволяет загружать и использовать пользовательские файлы кистей уже сегодня. После десериализации пользовательское BrushFamily можно использовать для создания новой Brush с определенным цветом и размером, как и любое из семейств StockBrushes .
class CustomBrushes(val context: Context) {
private const val TAG = "CustomBrushes"
val brushes by lazy { loadCustomBrushes(context) }
@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
)