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

虽然 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
)