APIs do Brush

As APIs Brush oferecem as ferramentas para definir o estilo visual dos seus traços. Você pode criar pincéis com diferentes cores, tamanhos e famílias para conseguir uma variedade de estilos.

Criar um pincel

Para criar um pincel, use os métodos complementares Brush do Compose com argumentos nomeados, como Brush.Companion.createWithComposeColor. Com essa classe, é possível definir as seguintes propriedades:

  • family: o estilo do pincel, análogo a um tipo ou fonte em texto. Consulte StockBrushes para conferir os valores de BrushFamily disponíveis.
  • color: a cor do pincel. É possível definir a cor usando um ColorLong.
  • size: a espessura geral dos traços criados com o pincel.
  • epsilon: a menor distância para que dois pontos sejam considerados visualmente distintos para fins de geometria de geração de traços. A proporção de epsilon e pontos de traço controla o quanto um traço pode ser ampliado sem artefatos, ao custo de memória. Um bom ponto de partida para unidades de traço é 1 px, e para epsilon é 0,1. Valores mais altos de epsilon usam menos memória, mas permitem menos zoom antes que artefatos de triângulo apareçam. Faça testes para encontrar o valor certo para seu caso de uso.
val brush = Brush.createWithComposeColor(
  family = StockBrushes.pressure(),
  colorIntArgb = Color.Black,
  size = 5F,
  epsilon = 0.1F
)

Modificar propriedades do pincel

É possível criar uma cópia de um pincel usando o método copyWithComposeColor(), que permite mudar qualquer uma das propriedades do pincel.

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

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

Pincéis personalizados

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
)