Brush API

Ink Brush API を使用すると、キャンバスに描画するためのブラシを作成してカスタマイズできます。

ブラシを作成する

ブラシを作成するには、Brush.createWithColorLong() などの名前付き引数を使用して Brush ファクトリ メソッドを使用します。このクラスでは、次のプロパティを設定できます。

  • family: ブラシのスタイル。テキストの書体やフォントに似ています。使用可能な BrushFamily 値については、StockBrushes をご覧ください。
  • color: ブラシの色。色は ColorLong を使用して設定できます。
  • size: ブラシで作成されたストロークの基本の太さ。
  • epsilon: ストローク内の 2 つの点を区別する必要がある最小距離。ストロークのジオメトリの詳細レベルまたは忠実度を制御します。
    • 値を大きくすると、ストロークがより単純化され、メモリ使用量が減り、レンダリングが速くなりますが、拡大したときにギザギザの縁などのアーティファクトが目立つことがあります。
    • 値を小さくすると、高品質のズームでより多くの詳細が保持されますが、メモリ使用量が増加します。
    • 1 px 単位スケールでプロトタイピングを行う場合は、0.1 から始めることをおすすめします。さまざまな画面密度をサポートする本番環境アプリでは、密度非依存単位(dp など)を使用し、それに応じてイプシロンを調整します。
val redBrush = Brush.createWithColorLong(
  family = StockBrushes.pressurePen(),
  colorLong = Color.RED.pack(),
  size = 5F,
  epsilon = 0.1F
)

ブラシのプロパティを変更する

copy() メソッドを使用して、既存のブラシのコピーを作成できます。このメソッドを使用すると、ブラシのプロパティを変更できます。

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

カスタムブラシ

StockBrushes は汎用性の高い一般的なブラシのセットを提供しますが、Ink API は、独自の芸術的な効果を生み出すため、または下位互換性のために特定の既存のブラシを複製するために、まったく新しいブラシの動作を作成する高度なパスも提供します。

カスタム BrushFamily はシリアル化された形式から読み込まれます。必要な形式は、BrushFamily プロトコル バッファの gzip 圧縮されたバイナリ エンコードです。これにより、カスタム ブラシファイルを読み込んで使用できるようになります。逆シリアル化されたカスタム BrushFamily は、StockBrushes ファミリーと同様に、特定の色とサイズで新しい Brush を作成するために使用できます。

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
)