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
While StockBrushes provides a versatile set of
common brushes, Ink API also offers an advanced path for creating entirely new
brush behaviors for unique artistic effects or to replicate specific existing
brushes for backward compatibility.
A custom BrushFamily is loaded from its serialized format. The required format
is the gzipped binary encoding of the
BrushFamily protocol buffer. This lets you load and use
custom brush files today. Once deserialized, the custom BrushFamily can be
used to create a new Brush with a specific color and size, just like any of
the StockBrushes families.
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
)