Brush API

Brush API আপনাকে স্ট্রোকের ভিজ্যুয়াল স্টাইল সংজ্ঞায়িত করার টুল প্রদান করে। আপনি বিভিন্ন রঙ, সাইজ ও ফ্যামিলির ব্রাশ তৈরি করতে পারেন যাতে বিভিন্ন ধরনের লুক পাওয়া যায়।

ব্রাশ তৈরি করুন

ব্রাশ তৈরি করতে, কম্পোজ Brush কম্প্যানিয়ন পদ্ধতি ব্যবহার করুন, যার সাথে নামযুক্ত আর্গুমেন্ট যেমন Brush.Companion.createWithComposeColor থাকে। এই ক্লাস আপনাকে নিম্নলিখিত প্রপার্টি সেট করতে দেয়:

  • family: ব্রাশের স্টাইল, টেক্সটের টাইপফেস বা ফন্টের মতো। উপলভ্য BrushFamily ভ্যালুর জন্য StockBrushes দেখুন।
  • color: ব্রাশের রঙ। আপনি ColorLong ব্যবহার করে রঙ সেট করতে পারেন।
  • size: ব্রাশ দিয়ে তৈরি করা স্ট্রোকের সামগ্রিক ঘনত্ব।
  • epsilon: স্ট্রোক জেনারেশন জিওমেট্রি সংক্রান্ত উদ্দেশ্যে, দুটি পয়েন্টকে ভিজ্যুয়ালি আলাদা হিসেবে বিবেচনা করার জন্য সবচেয়ে কম দূরত্ব। এপসিলন ও স্ট্রোক পয়েন্টের অনুপাত নিয়ন্ত্রণ করে যে মেমরির বিনিময়ে আর্টিফ্যাক্ট ছাড়াই স্ট্রোক কতটা জুম করা যাবে। স্ট্রোক ইউনিটের জন্য ভালো স্টার্টিং পয়েন্ট হল ১ পিক্সেল এবং এপসিলনের জন্য ভালো স্টার্টিং পয়েন্ট হল ০.১। এপসিলনের বেশি মান কম মেমরি ব্যবহার করে কিন্তু ট্রায়াঙ্গেল আর্টিফ্যাক্ট দেখা যাওয়ার আগে কম জুম করার অনুমতি দেয়। আপনার ব্যবহারের ক্ষেত্রে সঠিক ভ্যালু খুঁজে পেতে পরীক্ষা করুন।

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
)