Interfejsy Brush API

Interfejsy Brush API udostępniają narzędzia do określania stylu wizualnego pociągnięć. Możesz tworzyć pędzle o różnych kolorach, rozmiarach i rodzajach, aby uzyskać różne efekty.

Tworzenie pędzla

Aby utworzyć pędzel, użyj metod towarzyszących Compose Brush z argumentami nazwanymi, takimi jak Brush.Companion.createWithComposeColor. Ta klasa umożliwia ustawienie tych właściwości:

  • family: styl pędzla, analogiczny do kroju lub czcionki w tekście. Dostępne wartości znajdziesz w sekcji StockBrushes.BrushFamily
  • color: kolor pędzla. Kolor możesz ustawić za pomocą ColorLong.
  • size: ogólna grubość pociągnięć pędzla.
  • epsilon: najmniejsza odległość, przy której dwa punkty powinny być uznawane za wizualnie odrębne na potrzeby geometrii generowania pociągnięć. Stosunek punktów epsilon i punktów pociągnięcia kontroluje, jak bardzo można powiększyć pociągnięcie bez artefaktów, kosztem pamięci. Dobrym punktem wyjścia dla jednostek skoku jest 1 piksel, a dla epsilona – 0,1. Wyższe wartości epsilona zużywają mniej pamięci, ale pozwalają na mniejsze powiększenie, zanim pojawią się artefakty w postaci trójkątów. Eksperymentuj, aby znaleźć odpowiednią wartość dla swojego przypadku użycia.
val brush = Brush.createWithComposeColor(
  family = StockBrushes.pressure(),
  colorIntArgb = Color.Black,
  size = 5F,
  epsilon = 0.1F
)

Modyfikowanie właściwości pędzla

Możesz utworzyć kopię istniejącego pędzla za pomocą metody copyWithComposeColor(), która umożliwia zmianę dowolnej właściwości pędzla.

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

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

Pędzle niestandardowe

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
)