Les API Ink Brush permettent de créer et de personnaliser des pinceaux pour dessiner sur un canevas.
Créer un pinceau
Pour créer un pinceau, utilisez les méthodes de fabrique Brush avec des arguments nommés tels que Brush.createWithColorLong(). Cette classe vous permet de définir les propriétés suivantes :
family: style du pinceau, analogue à une typographie ou une police dans le texte. ConsultezStockBrushespour connaître les valeursBrushFamilydisponibles.color: couleur du pinceau. Vous pouvez définir la couleur à l'aide d'unColorLong.size: épaisseur de base des traits créés avec le pinceau.epsilon: distance minimale à laquelle deux points du tracé doivent être considérés comme distincts, ce qui contrôle le niveau de détail ou la fidélité de la géométrie du tracé.- Des valeurs plus élevées simplifient davantage le tracé, ce qui utilise moins de mémoire et rend plus rapidement, mais peut entraîner des artefacts visibles tels que des bords irréguliers lors d'un zoom avant.
- Les valeurs inférieures préservent plus de détails pour un zoom de haute qualité, mais augmentent l'utilisation de la mémoire.
- Pour le prototypage avec une échelle d'unité de 1 px, 0,1 est un bon point de départ. Pour les applications de production compatibles avec différentes densités d'écran, utilisez des unités indépendantes de la densité (comme dp) et ajustez l'epsilon en conséquence.
val redBrush = Brush.createWithColorLong(
family = StockBrushes.pressurePen(),
colorLong = Color.RED.pack(),
size = 5F,
epsilon = 0.1F
)
Modifier les propriétés du pinceau
Vous pouvez créer une copie d'un pinceau existant à l'aide de la méthode copy(). Cette méthode vous permet de modifier les propriétés du pinceau.
val blueBrush = redBrush.copy(colorLong = Color.BLUE.pack())
Pinceaux personnalisés
虽然 StockBrushes 提供了一组通用的多功能笔刷,但 Ink API 还提供了一种高级方法,用于创建全新的笔刷行为,以实现独特的艺术效果,或复制特定的现有笔刷以实现向后兼容性。
自定义 BrushFamily 从其序列化格式加载。所需格式为 BrushFamily 协议缓冲区的 gzip 压缩二进制编码。这样一来,您就可以立即加载和使用自定义笔刷文件。反序列化后,自定义 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
)