ब्रश एपीआई

Brush एपीआई, आपको स्ट्रोक की विज़ुअल स्टाइल तय करने के लिए टूल उपलब्ध कराते हैं. अलग-अलग तरह के लुक पाने के लिए, अलग-अलग रंगों, साइज़, और फ़ैमिली वाले ब्रश बनाए जा सकते हैं.

ब्रश बनाना

ब्रश बनाने के लिए, Compose Brush के कंपैनियन फ़ंक्शन का इस्तेमाल करें. साथ ही, Brush.Companion.createWithComposeColor जैसे नाम वाले आर्ग्युमेंट का इस्तेमाल करें. इस क्लास की मदद से, ये प्रॉपर्टी सेट की जा सकती हैं:

  • family: ब्रश की स्टाइल, जो टेक्स्ट में टाइपफ़ेस या फ़ॉन्ट की तरह होती है. उपलब्ध BrushFamily वैल्यू के लिए, StockBrushes देखें.
  • color: ब्रश का रंग. ColorLong का इस्तेमाल करके, रंग सेट किया जा सकता है.
  • size: ब्रश से बनाए गए स्ट्रोक की कुल मोटाई.
  • epsilon: स्ट्रोक जनरेशन ज्यामिति के लिए, दो पॉइंट के बीच की कम से कम दूरी, ताकि वे विज़ुअल तौर पर अलग-अलग दिखें. एप्सिलॉन और स्ट्रोक पॉइंट का अनुपात यह कंट्रोल करता है कि किसी स्ट्रोक को बिना आर्टफ़ैक्ट के कितना ज़ूम इन किया जा सकता है. हालांकि, इसके लिए ज़्यादा मेमोरी की ज़रूरत होती है. स्ट्रोक यूनिट के लिए 1 पिक्सल और एप्सिलॉन के लिए 0.1 से शुरुआत करना सही रहता है. एप्सिलॉन की ज़्यादा वैल्यू इस्तेमाल करने पर, कम मेमोरी खर्च होती है. हालांकि, इससे ट्रायंगल आर्टफ़ैक्ट दिखने से पहले, कम ज़ूम किया जा सकता है. अपने इस्तेमाल के उदाहरण के लिए सही वैल्यू ढूंढने के लिए, एक्सपेरिमेंट करें.

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

ब्रश की प्रॉपर्टी में बदलाव करना

copyWithComposeColor() तरीके का इस्तेमाल करके, किसी मौजूदा ब्रश की कॉपी बनाई जा सकती है. इससे आपको ब्रश की किसी भी प्रॉपर्टी को बदलने की सुविधा मिलती है.

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

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

पसंद के मुताबिक ब्रश

StockBrushes में कई तरह के सामान्य ब्रश उपलब्ध हैं. हालांकि, Ink API में पूरी तरह से नए ब्रश बनाने का एक बेहतर तरीका भी मौजूद है. इससे, यूनीक आर्टिस्टिक इफ़ेक्ट बनाए जा सकते हैं या पुराने सिस्टम के साथ काम करने की सुविधा के लिए, मौजूदा ब्रश को फिर से बनाया जा सकता है.

कस्टम BrushFamily को उसके सीरियलाइज़ किए गए फ़ॉर्मैट से लोड किया जाता है. ज़रूरी फ़ॉर्मैट, BrushFamily प्रोटोकॉल बफ़र की gzipped बाइनरी एन्कोडिंग है. इससे आज ही कस्टम ब्रश फ़ाइलें लोड करके इस्तेमाल की जा सकती हैं. डीसिरियलाइज़ होने के बाद, कस्टम BrushFamily का इस्तेमाल करके, किसी खास रंग और साइज़ के साथ नया Brush बनाया जा सकता है. ठीक वैसे ही जैसे किसी StockBrushes फ़ैमिली के लिए किया जाता है.

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
)