API BrushMực cung cấp một cách để tạo và tuỳ chỉnh các bút vẽ để vẽ trên canvas.
Tạo cọ vẽ
Để tạo một cọ vẽ, hãy sử dụng các phương thức của nhà máy Brush với các đối số được đặt tên, chẳng hạn như Brush.createWithColorLong(). 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 cơ bản 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 trong nét vẽ phải được coi là riêng biệt, điều này kiểm soát mức độ chi tiết hoặc độ trung thực của hình học nét vẽ.- Giá trị càng cao thì nét vẽ càng đơn giản, giúp sử dụng ít bộ nhớ hơn và kết xuất nhanh hơn, nhưng có thể dẫn đến các hiện tượng giả tạo có thể nhìn thấy như các cạnh răng cưa khi phóng to.
- Các giá trị thấp hơn sẽ giữ lại nhiều chi tiết hơn để thu phóng chất lượng cao, nhưng làm tăng mức sử dụng bộ nhớ.
- Đối với việc tạo mẫu bằng thang đơn vị 1 px, 0,1 là một điểm khởi đầu tốt. Đối với các ứng dụng phát hành hỗ trợ nhiều mật độ màn hình, hãy sử dụng các đơn vị không phụ thuộc vào mật độ (chẳng hạn như dp) và điều chỉnh epsilon cho phù hợp.
val redBrush = Brush.createWithColorLong(
family = StockBrushes.pressurePen(),
colorLong = Color.RED.pack(),
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 copy(). 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 blueBrush = redBrush.copy(colorLong = Color.BLUE.pack())
Cọ vẽ tuỳ chỉnh
Mặc dù StockBrushes cung cấp một bộ cọ đa năng, nhưng Ink API cũng cung cấp một đường dẫn nâng cao để tạo hành vi cọ hoàn toàn mới cho các hiệu ứng nghệ thuật độc đáo hoặc để sao chép các cọ hiện có cụ thể nhằm đảm bảo khả năng tương thích ngược.
Một BrushFamily tuỳ chỉnh được tải từ định dạng được chuyển đổi tuần tự của nó. Định dạng bắt buộc là mã hoá nhị phân nén gzip của vùng đệm giao thức BrushFamily. Quyền này cho phép bạn tải và sử dụng các tệp cọ tuỳ chỉnh ngay hôm nay. Sau khi được chuyển đổi, BrushFamily tuỳ chỉnh có thể được dùng để tạo Brush mới với một màu sắc và kích thước cụ thể, giống như bất kỳ họ StockBrushes nào.
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
)