Brush API

Brush API 提供工具,可定義筆劃的視覺樣式。您可以建立不同顏色、大小和系列的筆刷,呈現各種效果。

建立筆刷

如要建立筆刷,請使用 Compose Brush 伴生物件方法,並搭配 Brush.Companion.createWithComposeColor 等具名引數。這個類別可讓您設定下列屬性:

  • family:筆刷的樣式,類似於文字的字體或字型。如要查看可用的 BrushFamily 值,請參閱 StockBrushes。
  • color:筆刷顏色。您可以使用 ColorLong 設定顏色。
  • size::使用筆刷建立的筆觸整體粗細。
  • epsilon:在筆劃生成幾何圖形時,兩個點應視為視覺上不同的最短距離。epsilon 和筆劃點的比率會控制筆劃可放大的程度,而不會產生不自然感,但會耗用記憶體。筆劃單位的建議起始值為 1 px,epsilon 的建議起始值為 0.1。Epsilon 值越高,使用的記憶體越少,但在出現三角形構件之前,可縮放的程度也越低。請多方嘗試,找出適合您用途的值。

val brush = Brush.createWithComposeColor(
    family = StockBrushes.pressurePen(),
    color = Color.Black,
    size = 5F,
    epsilon = 0.1F
)

修改筆刷屬性

您可以使用 copyWithComposeColor() 方法建立現有筆刷的副本,以便變更筆刷的任何屬性。

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

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

自訂筆刷

虽然 StockBrushes 提供了一组通用的画笔,但 Ink API 还提供了一种高级途径,可用于创建全新的画笔行为,以实现独特的艺术效果,或复制特定的现有画笔,以实现向后兼容性。

从序列化格式加载自定义 BrushFamily。所需格式为 BrushFamily 协议缓冲区的 gzip 压缩二进制编码。这样,您现在就可以加载和使用自定义画笔文件。反序列化后,自定义 BrushFamily 可用于创建具有特定颜色和大小的新 Brush,就像任何 StockBrushes 系列一样。

class CustomBrushes(val context: Context) {

    companion object {
        private const val TAG = "CustomBrushes"
    }

    val brushes by lazy { loadCustomBrushes() }

    @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)
        }
        return loadedBrushes
    }
}

data class CustomBrush(
    val name: String,
    val icon: Int,
    val brushFamily: BrushFamily
)