Brush API

墨水 Brush API 提供了一种创建和自定义画笔以在画布上绘制内容的方法。

创建画笔

如需创建画笔,请使用 Brush 工厂方法和命名实参(例如 Brush.createWithColorLong())。此类可让您设置以下属性:

  • family:笔刷的样式,类似于文本中的字体。 如需了解可用的 BrushFamily 值,请参阅 StockBrushes。
  • color:画笔的颜色。您可以使用 ColorLong 设置颜色。
  • size:使用画笔创建的笔画的基本粗细。
  • epsilon:笔画中两个点必须被视为不同的最小距离,用于控制笔画几何图形的细节或保真度。
    • 值越高,笔画越简化,使用的内存越少,渲染速度越快,但放大时可能会出现明显的伪影,例如锯齿状边缘。
    • 值越低,在高画质缩放时保留的细节越多,但内存用量也会增加。
    • 对于以 1 px 为单位比例进行的原型设计,0.1 是一个不错的起点。 对于支持各种屏幕密度的正式版应用,请使用密度无关单位(例如 dp),并相应地调整 epsilon。
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 可用于创建具有特定颜色和大小的新 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.copy(clientBrushFamilyId = name))
        }
        return loadedBrushes
    }
}

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