API bút vẽ

Các API Brush cung cấp cho bạn các công cụ để xác định kiểu hình ảnh của nét vẽ. Bạn có thể tạo bút vẽ với nhiều màu sắc, kích thước và nhóm khác nhau để đạt được nhiều kiểu dáng.

Tạo bút vẽ

Để tạo bút vẽ, hãy sử dụng các phương thức đồng hành Brush của Compose với các đối số được đặt tên như Brush.Companion.createWithComposeColor. Lớp này cho phép bạn đặt các thuộc tính sau:

  • family: Kiểu của bút vẽ, tương tự như kiểu chữ hoặc phông chữ trong văn bản. Hãy xem StockBrushes để biết các giá trị BrushFamily hiện có.
  • color: Màu cọ vẽ. Bạn có thể đặt màu bằng cách sử dụng ColorLong.
  • size: Độ dày tổng thể của nét vẽ được tạo bằng bút vẽ.
  • epsilon: Khoảng cách nhỏ nhất mà hai điểm nên được coi là khác biệt về mặt hình ảnh cho mục đích hình học tạo nét vẽ. Tỷ lệ giữa epsilon và điểm nét vẽ kiểm soát mức độ phóng to của nét vẽ mà không có cấu phần phần mềm, với chi phí bộ nhớ. Điểm xuất phát phù hợp cho đơn vị nét vẽ là 1 px và điểm xuất phát phù hợp cho epsilon là 0, 1. Giá trị epsilon cao hơn sẽ sử dụng ít bộ nhớ hơn nhưng cho phép thu phóng ít hơn trước khi các cấu phần phần mềm hình tam giác xuất hiện. Hãy thử nghiệm để tìm giá trị phù hợp cho trường hợp sử dụng của bạn.

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

Sửa đổi thuộc tính của bút vẽ

Bạn có thể tạo bản sao của một bút vẽ hiện có bằng phương thức copyWithComposeColor(). Phương thức này cho phép bạn thay đổi bất kỳ thuộc tính nào của bút vẽ.

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

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

Bút vẽ tuỳ chỉnh

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) {

    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
)