Các API Brush cung cấp cho bạn các công cụ để xác định kiểu trực quan của nét vẽ. Bạn có thể tạo các cọ vẽ với nhiều màu sắc, kích thước và họ cọ để tạo ra nhiều kiểu dáng.
Tạo cọ vẽ
Để tạo một cọ 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, chẳng hạ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 cọ vẽ, tương tự như kiểu chữ hoặc phông chữ trong văn bản. Hãy xemStockBrushesđể biết các giá trịBrushFamilyhiện có.color: Màu cọ vẽ. Bạn có thể đặt màu bằngColorLong.size: Độ dày tổng thể của các nét vẽ được tạo bằng cọ vẽ.epsilon: Khoảng cách nhỏ nhất mà hai điểm được coi là khác biệt về mặt thị giác cho mục đích tạo hình học của nét vẽ. Tỷ lệ giữa epsilon và các điểm nét vẽ kiểm soát mức độ thu phóng một nét vẽ mà không có hiện tượng giả tạo, nhưng sẽ tốn bộ nhớ. Điểm bắt đầu phù hợp cho các đơn vị nét vẽ là 1 px và điểm bắt đầu phù hợp cho epsilon là 0, 1. Giá trị epsilon càng cao thì càng sử dụng ít bộ nhớ nhưng cho phép thu phóng ít hơn trước khi xuất hiện các thành phần giả dạng hình tam giác. Hãy thử nghiệm để tìm ra giá trị phù hợp cho trường hợp sử dụng của bạn.
val brush = Brush.createWithComposeColor(
family = StockBrushes.pressure(),
colorIntArgb = Color.Black,
size = 5F,
epsilon = 0.1F
)
Sửa đổi thuộc tính bút vẽ
Bạn có thể tạo bản sao của một cọ 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 cọ vẽ.
val redBrush = Brush.createWithComposeColor(
family = StockBrushes.pressurePen(),
colorIntArgb = Color.RED,
size = 5F,
epsilon = 0.1F
)
val blueBrush = redBrush.copyWithComposeColor(color = Color.BLUE)
Cọ 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) {
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
)