واجهات برمجة تطبيقات الفرشاة

توفّر لك واجهات برمجة التطبيقات Brush الأدوات اللازمة لتحديد النمط المرئي لضربات الفرشاة. يمكنك إنشاء فُرش بألوان وأحجام وأنواع مختلفة للحصول على مجموعة متنوعة من المظاهر.

إنشاء فرشاة

لإنشاء فرشاة، استخدِم طرق Compose Brush المساعدة مع وسيطات مسمّاة، مثل Brush.Companion.createWithComposeColor. يتيح لك هذا الصف ضبط الخصائص التالية:

  • family: نمط الفرشاة، وهو مشابه لنمط الخط أو الخط في النص. راجِع StockBrushes للاطّلاع على قيم BrushFamily المتاحة.
  • color: تمثّل هذه السمة لون الفرشاة. يمكنك ضبط اللون باستخدام ColorLong.
  • size: يشير إلى السمك الإجمالي للخطوط التي تم إنشاؤها باستخدام الفرشاة.
  • epsilon: هي أصغر مسافة يجب اعتبارها بين نقطتَين مختلفتَين بصريًا لأغراض إنشاء أشكال هندسية للخطوط. تتحكّم نسبة إبسيلون إلى نقاط ضربات الفرشاة في مقدار التكبير الذي يمكن تطبيقه على ضربة الفرشاة بدون ظهور تشوّهات، وذلك على حساب الذاكرة. نقطة البداية الجيدة لوحدات ضربات الفرشاة هي 1 بكسل، ونقطة البداية الجيدة لقيمة إبسيلون هي 0.1. تستهلك قيم إبسيلون الأعلى مقدارًا أقل من الذاكرة، ولكنها تسمح بتصغير أقل قبل ظهور تشوّهات المثلثات. جرِّب قيمًا مختلفة للعثور على القيمة المناسبة لحالة الاستخدام.
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
)