Brush-APIs

Die Ink Brush APIs bieten eine Möglichkeit, Pinsel zum Zeichnen auf einem Canvas zu erstellen und anzupassen.

Pinsel erstellen

Verwenden Sie zum Erstellen eines Pinsels die Factory-Methoden Brush mit benannten Argumenten wie Brush.createWithColorLong(). Mit dieser Klasse können Sie die folgenden Attribute festlegen:

  • family: Der Stil des Pinsels, analog zu einer Schriftart im Text. Mögliche BrushFamily-Werte finden Sie unter StockBrushes.
  • color: Die Farbe des Pinsels. Sie können die Farbe mit einem ColorLong festlegen.
  • size: Die Basisstärke von Strichen, die mit dem Pinsel erstellt werden.
  • epsilon: Der kleinste Abstand, bei dem zwei Punkte im Strich als unterschiedlich betrachtet werden müssen. Dies steuert den Detaillierungsgrad oder die Genauigkeit der Strichgeometrie.
    • Höhere Werte vereinfachen den Strich stärker, was weniger Speicherplatz benötigt und schneller gerendert wird. Beim Zoomen können jedoch sichtbare Artefakte wie gezackte Kanten auftreten.
    • Bei niedrigeren Werten bleiben mehr Details für das Zoomen in hoher Qualität erhalten, aber der Speicherverbrauch steigt.
    • Für Prototypen mit einer Einheitsskala von 1 px ist 0, 1 ein guter Ausgangspunkt. Verwenden Sie für Produktions-Apps, die verschiedene Bildschirmdichten unterstützen, dichteunabhängige Einheiten (z. B. „dp“) und passen Sie „epsilon“ entsprechend an.
val redBrush = Brush.createWithColorLong(
  family = StockBrushes.pressurePen(),
  colorLong = Color.RED.pack(),
  size = 5F,
  epsilon = 0.1F
)

Pinseleigenschaften ändern

Mit der Methode copy() können Sie eine Kopie eines vorhandenen Pinsels erstellen. Mit dieser Methode können Sie beliebige Eigenschaften des Pinsels ändern.

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

Benutzerdefinierte Pinsel

StockBrushes bietet eine vielseitige Auswahl an gängigen Pinseln. Die Ink API bietet aber auch einen erweiterten Pfad zum Erstellen völlig neuer Pinselverhaltensweisen für einzigartige künstlerische Effekte oder zum Replizieren bestimmter vorhandener Pinsel zur Abwärtskompatibilität.

Ein benutzerdefiniertes BrushFamily wird aus seinem serialisierten Format geladen. Das erforderliche Format ist die gezippte binäre Codierung des BrushFamily-Protokollpuffers. So können Sie bereits jetzt benutzerdefinierte Pinseldateien laden und verwenden. Nach der Deserialisierung kann das benutzerdefinierte BrushFamily verwendet werden, um ein neues Brush mit einer bestimmten Farbe und Größe zu erstellen, genau wie bei den StockBrushes-Familien.

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
)