Brush APIs

رابط‌های برنامه‌نویسی کاربردی Brush APIs) ابزارهایی را برای تعریف سبک بصری خطوط در اختیار شما قرار می‌دهند. می‌توانید قلم‌موهایی با رنگ‌ها، اندازه‌ها و خانواده‌های مختلف ایجاد کنید تا به ظاهرهای متنوعی دست یابید.

یک قلم مو ایجاد کنید

برای ایجاد یک قلم‌مو، از متدهای همراه Compose Brush با آرگومان‌های نامگذاری شده مانند Brush.Companion.createWithComposeColor استفاده کنید. این کلاس به شما امکان می‌دهد ویژگی‌های زیر را تنظیم کنید:

  • family : سبک قلم‌مو، مشابه با یک فونت یا فونت در متن. برای مقادیر موجود BrushFamily به StockBrushes مراجعه کنید.
  • color : رنگ قلم‌مو. می‌توانید رنگ را با استفاده از ColorLong تنظیم کنید.
  • size : ضخامت کلی خطوط ایجاد شده با قلم‌مو.
  • epsilon : کوچکترین فاصله‌ای که دو نقطه باید از نظر بصری برای اهداف هندسه تولید خط‌کشی متمایز در نظر گرفته شوند. نسبت اپسیلون و نقاط خط‌کشی، میزان بزرگنمایی یک خط‌کشی را بدون ایجاد مصنوعات و با هزینه حافظه کنترل می‌کند. یک نقطه شروع خوب برای واحدهای خط‌کشی ۱ پیکسل و یک نقطه شروع خوب برای اپسیلون ۰.۱ است. مقادیر بالاتر اپسیلون از حافظه کمتری استفاده می‌کنند اما امکان بزرگنمایی کمتری را قبل از ظاهر شدن مصنوعات مثلثی فراهم می‌کنند. برای یافتن مقدار مناسب برای مورد استفاده خود، آزمایش کنید.
val brush = Brush.createWithComposeColor(
  family = StockBrushes.pressure(),
  colorIntArgb = Color.Black,
  size = 5F,
  epsilon = 0.1F
)

تغییر ویژگی‌های قلم‌مو

شما می‌توانید با استفاده از متد copyWithComposeColor() یک کپی از یک براش موجود ایجاد کنید، که به شما امکان می‌دهد هر یک از ویژگی‌های براش را تغییر دهید.

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

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

برس‌های سفارشی

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
)