API Brush

Les API Brush vous fournissent les outils nécessaires pour définir le style visuel de vos traits. Vous pouvez créer des pinceaux avec différentes couleurs, tailles et familles pour obtenir différents styles.

Créer un pinceau

Pour créer un pinceau, utilisez les méthodes associées Brush de Compose avec des arguments nommés tels que Brush.Companion.createWithComposeColor. 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. Consultez StockBrushes pour connaître les valeurs BrushFamily disponibles.
  • color : couleur du pinceau. Vous pouvez définir la couleur à l'aide d'un ColorLong.
  • size : épaisseur globale des traits créés avec le pinceau.
  • epsilon : distance minimale à partir de laquelle deux points doivent être considérés comme visuellement distincts pour la géométrie de génération de traits. Le rapport entre epsilon et les points de tracé contrôle le niveau de zoom maximal d'un tracé sans artefacts, au détriment de la mémoire. Un bon point de départ pour les unités de contour est 1 px, et un bon point de départ pour l'epsilon est 0,1. Les valeurs epsilon plus élevées utilisent moins de mémoire, mais permettent un zoom moins important avant que des artefacts triangulaires n'apparaissent. Faites des tests pour trouver la valeur adaptée à votre cas d'utilisation.
val brush = Brush.createWithComposeColor(
  family = StockBrushes.pressure(),
  colorIntArgb = Color.Black,
  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 copyWithComposeColor(), qui vous permet de modifier n'importe quelle propriété du pinceau.

val redBrush = Brush.createWithComposeColor(
  family = StockBrushes.pressurePen(),
  colorIntArgb = Color.RED,
  size = 5F,
  epsilon = 0.1F
)

val blueBrush = redBrush.copyWithComposeColor(color = Color.BLUE)

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
)