ব্রাশ API

ইঙ্ক Brush এপিআই ক্যানভাসে আঁকার জন্য ব্রাশ তৈরি এবং কাস্টমাইজ করার একটি উপায় প্রদান করে।

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

ব্রাশ তৈরি করতে, Brush.createWithColorLong() এর মতো নামযুক্ত আর্গুমেন্ট সহ Brush ফ্যাক্টরি পদ্ধতি ব্যবহার করুন। এই ক্লাসটি আপনাকে নিম্নলিখিত বৈশিষ্ট্যগুলি সেট করতে দেয়:

  • family : ব্রাশের স্টাইল, টেক্সটের টাইপফেস বা ফন্টের অনুরূপ। উপলব্ধ BrushFamily মানগুলির জন্য StockBrushes দেখুন।
  • color : ব্রাশের রঙ। আপনি ColorLong ব্যবহার করে রঙ সেট করতে পারেন।
  • size : ব্রাশ দিয়ে তৈরি স্ট্রোকের বেস বেধ।
  • epsilon : স্ট্রোকের দুটি বিন্দুকে পৃথক বিবেচনা করা উচিত এমন ক্ষুদ্রতম দূরত্ব, যা স্ট্রোকের জ্যামিতির বিশদ বা বিশ্বস্ততার স্তর নিয়ন্ত্রণ করে।
    • উচ্চতর মান স্ট্রোককে আরও সহজ করে তোলে, যা কম মেমোরি ব্যবহার করে এবং দ্রুত রেন্ডার করে, কিন্তু জুম ইন করলে জ্যাগড এজের মতো দৃশ্যমান শিল্পকর্ম দেখা যেতে পারে।
    • উচ্চ-মানের জুমিংয়ের জন্য নিম্ন মানগুলি আরও বিশদ সংরক্ষণ করে, তবে মেমরির ব্যবহার বৃদ্ধি করে।
    • ১ পিক্সেল ইউনিট স্কেলের প্রোটোটাইপিংয়ের জন্য, ০.১ একটি ভালো সূচনা বিন্দু। বিভিন্ন স্ক্রিন ঘনত্ব সমর্থনকারী প্রোডাকশন অ্যাপের জন্য, ঘনত্ব-স্বাধীন ইউনিট (যেমন dp) ব্যবহার করুন এবং সেই অনুযায়ী এপসিলন সামঞ্জস্য করুন।
val redBrush = Brush.createWithColorLong(
  family = StockBrushes.pressurePen(),
  colorLong = Color.RED.pack(),
  size = 5F,
  epsilon = 0.1F
)

ব্রাশের বৈশিষ্ট্য পরিবর্তন করুন

আপনি copy() পদ্ধতি ব্যবহার করে একটি বিদ্যমান ব্রাশের একটি কপি তৈরি করতে পারেন। এই পদ্ধতিটি আপনাকে ব্রাশের যেকোনো বৈশিষ্ট্য পরিবর্তন করতে দেয়।

val blueBrush = redBrush.copy(colorLong = Color.BLUE.pack())

কাস্টম ব্রাশ

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.copy(clientBrushFamilyId = name))
        }
        return loadedBrushes
    }
}

data class CustomBrush(
    val name: String,
    val icon: Int,
    val brushFamily: BrushFamily
)