API Brush

Le API Ink Brush forniscono un modo per creare e personalizzare i pennelli per disegnare su una tela.

Creare un pennello

Per creare un pennello, utilizza i metodi di fabbrica Brush con argomenti denominati come Brush.createWithColorLong(). Questa classe consente di impostare le seguenti proprietà:

  • family: lo stile del pennello, analogo a un carattere di testo. Consulta StockBrushes per i valori BrushFamily disponibili.
  • color: il colore del pennello. Puoi impostare il colore utilizzando un ColorLong.
  • size: Lo spessore di base dei tratti creati con il pennello.
  • epsilon: la distanza più piccola alla quale due punti del tratto devono essere considerati distinti, il che controlla il livello di dettaglio o la fedeltà della geometria del tratto.
    • Valori più elevati semplificano maggiormente il tratto, il che utilizza meno memoria e il rendering è più veloce, ma può comportare artefatti visibili come bordi frastagliati quando si esegue lo zoom in avanti.
    • Valori più bassi conservano più dettagli per lo zoom di alta qualità, ma aumentano l'utilizzo della memoria.
    • Per la prototipazione con una scala di unità di 1 px, 0,1 è un buon punto di partenza. Per le app di produzione che supportano varie densità dello schermo, utilizza unità indipendenti dalla densità (come dp) e regola epsilon di conseguenza.
val redBrush = Brush.createWithColorLong(
  family = StockBrushes.pressurePen(),
  colorLong = Color.RED.pack(),
  size = 5F,
  epsilon = 0.1F
)

Modificare le proprietà del pennello

Puoi creare una copia di un pennello esistente utilizzando il metodo copy(). Questo metodo ti consente di modificare qualsiasi proprietà del pennello.

val blueBrush = redBrush.copy(colorLong = Color.BLUE.pack())

Pennelli personalizzati

StockBrushes offre un set versatile di pennelli comuni, ma l'API Ink offre anche un percorso avanzato per creare comportamenti di pennello completamente nuovi per effetti artistici unici o per replicare pennelli esistenti specifici per la compatibilità con le versioni precedenti.

Un BrushFamily personalizzato viene caricato dal suo formato serializzato. Il formato richiesto è la codifica binaria compressa di BrushFamily protocol buffer. In questo modo puoi caricare e utilizzare oggi stesso i file di pennelli personalizzati. Una volta deserializzato, il BrushFamily personalizzato può essere utilizzato per creare un nuovo Brush con un colore e una dimensione specifici, proprio come qualsiasi delle famiglie 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
)