Compose-এ Material Design 2

Jetpack Compose-এ মেটেরিয়াল ডিজাইন-এর ইমপ্লিমেন্টেশন রয়েছে, যা ডিজিটাল ইন্টারফেস তৈরি করার জন্য একটি সর্বাঙ্গীন ডিজাইন সিস্টেম। মেটিরিয়াল ডিজাইন কম্পোনেন্ট (বোতাম, কার্ড, সুইচ ইত্যাদি) মেটিরিয়াল থিমিং-এর উপর ভিত্তি করে তৈরি করা হয়েছে, যা আপনার প্রোডাক্টের ব্র্যান্ডকে আরও ভালভাবে তুলে ধরার জন্য মেটিরিয়াল ডিজাইন কাস্টমাইজ করার একটি পদ্ধতিগত উপায়। মেটিরিয়াল থিমে রঙ, টাইপোগ্রাফি এবং আকার সংক্রান্ত অ্যাট্রিবিউট থাকে। আপনি এইসব অ্যাট্রিবিউট কাস্টমাইজ করলে, আপনার অ্যাপ তৈরি করার জন্য যেসব কম্পোনেন্ট ব্যবহার করেন সেগুলিতে আপনার করা পরিবর্তন অটোমেটিক দেখা যায়।

Jetpack Compose এই ধারণাগুলি MaterialTheme কম্পোজেবলের সাথে প্রয়োগ করে:

MaterialTheme(
    colors = // ...
    typography = // ...
    shapes = // ...
) {
    // app content
}

আপনার অ্যাপ্লিকেশন থিম করতে MaterialTheme-এ পাস করা প্যারামিটার কনফিগার করুন।

দুটি বিপরীত স্ক্রিনশট। প্রথমটি ডিফল্ট MaterialTheme স্টাইলিং ব্যবহার করে, দ্বিতীয় স্ক্রিনশটটি পরিবর্তিত স্টাইলিং ব্যবহার করে।
ছবি ১. প্রথম স্ক্রিনশটে এমন একটি অ্যাপ দেখানো হয়েছে যা `MaterialTheme` কনফিগার করে না এবং তাই এটি ডিফল্ট স্টাইলিং ব্যবহার করে। দ্বিতীয় স্ক্রিনশটে এমন একটি অ্যাপ দেখানো হয়েছে যা স্টাইলিং কাস্টমাইজ করার জন্য `MaterialTheme`-এ প্যারামিটার পাস করে।

রঙ

Compose-এ Color ক্লাস, একটি ডেটা-হোল্ডিং ক্লাসের মাধ্যমে রঙ মডেল করা হয়।

val Red = Color(0xffff0000)
val Blue = Color(red = 0f, green = 0f, blue = 1f)

আপনি এগুলি যেভাবে খুশি সাজাতে পারেন (টপ-লেভেল কনস্ট্যান্ট হিসেবে, সিঙ্গলটনের মধ্যে বা ইনলাইন হিসেবে সংজ্ঞায়িত), আমরা আপনার থিমে কালার নির্দিষ্ট করার এবং সেখান থেকে কালার উদ্ধার করার জন্য জোরালো সাজেশন দিই। এই পদ্ধতি ডার্ক থিম ও নেস্টেড থিম সাপোর্ট করা সম্ভব করে তোলে।

থিমের কালার প্যালেটের উদাহরণ
ছবি ২. Material কালার সিস্টেম।

Compose Colors ক্লাস প্রদান করে যা মেটেরিয়াল কালার সিস্টেম-এর মডেল হিসেবে কাজ করে। Colors-এ বিল্ডার ফাংশন আছে যা দিয়ে হালকা বা গাঢ় রঙের সেট তৈরি করা যায়:

private val Yellow200 = Color(0xffffeb46)
private val Blue200 = Color(0xff91a4fc)
// ...

private val DarkColors = darkColors(
    primary = Yellow200,
    secondary = Blue200,
    // ...
)
private val LightColors = lightColors(
    primary = Yellow500,
    primaryVariant = Yellow400,
    secondary = Blue700,
    // ...
)

আপনার Colors নির্ধারণ করার পরে, আপনি সেগুলি MaterialTheme-এ পাস করতে পারবেন:

MaterialTheme(
    colors = if (darkTheme) DarkColors else LightColors
) {
    // app content
}

থিমের রঙ ব্যবহার করুন

MaterialTheme.colors ব্যবহার করে আপনি MaterialTheme কম্পোজেবলে প্রদান করা Colors ফিরিয়ে আনতে পারবেন।

Text(
    text = "Hello theming",
    color = MaterialTheme.colors.primary
)

সারফেস ও কন্টেন্টের রঙ

অনেক কম্পোনেন্ট রঙ ও কন্টেন্টের রঙের পেয়ার গ্রহণ করে:

Surface(
    color = MaterialTheme.colors.surface,
    contentColor = contentColorFor(color),
    // ...
) { /* ... */ }

TopAppBar(
    backgroundColor = MaterialTheme.colors.primarySurface,
    contentColor = contentColorFor(backgroundColor),
    // ...
) { /* ... */ }

এটি আপনাকে শুধু কম্পোজেবলের রঙ সেট করতেই দেয় না, তার সাথে কন্টেন্টের জন্য ডিফল্ট রঙও প্রদান করে,যে কম্পোজেবলগুলি এর মধ্যে থাকে। অনেক কম্পোজেবল ডিফল্ট হিসেবে এই কন্টেন্ট কালার ব্যবহার করে। যেমন, Text-এর রঙ তার পেরেন্ট কন্টেন্টের রঙের উপর ভিত্তি করে সেট করা হয় এবং Icon সেই রঙ ব্যবহার করে তার টিন্ট সেট করে।

একই ব্যানারের দুটি উদাহরণ, আলাদা আলাদা রঙে
ছবি ৩. ব্যাকগ্রাউন্ডের রঙ পরিবর্তন করলে টেক্সট ও আইকনের রঙও পরিবর্তন হয়।

contentColorFor() পদ্ধতি যেকোনও থিমের রঙের জন্য উপযুক্ত "অন" রঙ পুনরুদ্ধার করে। যেমন, আপনি Surface-এ primary ব্যাকগ্রাউন্ড কালার সেট করলে, এটি কন্টেন্ট কালার হিসেবে onPrimary সেট করার জন্য এই ফাংশন ব্যবহার করে। আপনি যদি থিম-বহির্ভূত ব্যাকগ্রাউন্ডের রঙ সেট করেন, তাহলে আপনাকে একটি উপযুক্ত কন্টেন্টের রঙও নির্দিষ্ট করতে হবে। হায়ারার্কিতে নির্দিষ্ট পজিশনে বর্তমান ব্যাকগ্রাউন্ডের জন্য পছন্দের কন্টেন্ট কালার ফেরত পেতে LocalContentColor ব্যবহার করুন।

কন্টেন্ট আলফা

গুরুত্ব বোঝাতে এবং ভিজ্যুয়াল হায়ারার্কি প্রদান করতে, আপনি প্রায়ই কন্টেন্টের উপর কতটা জোর দেবেন তা পরিবর্তন করতে চান। মেটেরিয়াল ডিজাইন টেক্সট লেজিবিলিটি সাজেশন বিভিন্ন গুরুত্বের লেভেল বোঝাতে বিভিন্ন লেভেলের অস্বচ্ছতা ব্যবহার করার পরামর্শ দেয়।

Jetpack Compose LocalContentAlpha ব্যবহার করে এটি প্রয়োগ করে। আপনি এই CompositionLocal-এর জন্য একটি মান প্রদান করে একটি হায়ারার্কির জন্য কন্টেন্ট আলফা নির্দিষ্ট করতে পারেন। নেস্টেড কম্পোজেবল এই ভ্যালু ব্যবহার করে তাদের কন্টেন্টে আলফা ট্রিটমেন্ট প্রয়োগ করতে পারে। যেমন, Text এবং Icon ডিফল্ট হিসেবে LocalContentColor-এর কম্বিনেশন ব্যবহার করে যা LocalContentAlpha ব্যবহার করার জন্য অ্যাডজাস্ট করা হয়। মেটেরিয়াল কিছু স্ট্যান্ডার্ড আলফা ভ্যালু নির্দিষ্ট করে (high, medium, disabled) যা ContentAlpha অবজেক্টের মাধ্যমে মডেল করা হয়।

// By default, both Icon & Text use the combination of LocalContentColor &
// LocalContentAlpha. De-emphasize content by setting content alpha
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
    Text(
        // ...
    )
}
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.disabled) {
    Icon(
        // ...
    )
    Text(
        // ...
    )
}

CompositionLocal সম্পর্কে আরও জানতে, CompositionLocal-এর সাথে লোকালি স্কোপ করা ডেটা দেখুন।

একটি নিবন্ধের শিরোনামের স্ক্রিনশট, যা টেক্সটের বিভিন্ন স্তরের জোর দেখায়
ছবি ৪. তথ্যের ক্রম ভিজ্যুয়ালি বোঝাতে টেক্সটে বিভিন্ন লেভেলের জোর দিন। টেক্সটের প্রথম লাইনটি হল শিরোনাম এবং এতে সবচেয়ে গুরুত্বপূর্ণ তথ্য রয়েছে, তাই ContentAlpha.high ব্যবহার করা হয়েছে। দ্বিতীয় লাইনে কম গুরুত্বপূর্ণ মেটাডেটা থাকে, তাই ContentAlpha.medium ব্যবহার করা হয়।

ডার্ক থিম

Compose-এ, আপনি MaterialTheme কম্পোজেবলে Colors-এর বিভিন্ন সেট প্রদান করে লাইট এবং ডার্ক থিম প্রয়োগ করেন:

@Composable
fun MyTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {
    MaterialTheme(
        colors = if (darkTheme) DarkColors else LightColors,
        /*...*/
        content = content
    )
}

এই উদাহরণে, MaterialTheme তার নিজস্ব কম্পোজেবল ফাংশনে র‍্যাপ করা আছে, যা ডার্ক থিম ব্যবহার করা হবে কিনা তা নির্দিষ্ট করে এমন একটি প্যারামিটার গ্রহণ করে। এই ক্ষেত্রে, ফাংশনটি ডিভাইস থিম সেটিং কোয়েরি করে darkTheme-এর জন্য ডিফল্ট মান পায়।

বর্তমান Colors লাইট নাকি ডার্ক তা চেক করতে আপনি এই ধরনের কোড ব্যবহার করতে পারেন:

val isLightTheme = MaterialTheme.colors.isLight
Icon(
    painterResource(
        id = if (isLightTheme) {
            R.drawable.ic_sun_24
        } else {
            R.drawable.ic_moon_24
        }
    ),
    contentDescription = "Theme"
)

উচ্চতা সংক্রান্ত ওভারলে

Material-এ, ডার্ক থিমে উঁচু সারফেসের ক্ষেত্রে এলিভেশন ওভারলে ব্যবহার করা হয়, যা ব্যাকগ্রাউন্ডকে হালকা করে দেয়। কোনও সারফেসের এলিভেশন যত বেশি হবে (এটি একটি অন্তর্নিহিত আলোর উৎসের কাছাকাছি নিয়ে যাওয়া), সেই সারফেস তত হালকা হবে।

Surface কম্পোজেবল ডার্ক কালার ব্যবহার করার সময় অটোমেটিক এইসব ওভারলে প্রয়োগ করে এবং সারফেস ব্যবহার করে এমন অন্য যেকোনও মেটেরিয়াল কম্পোজেবলও তাই করে:

Surface(
    elevation = 2.dp,
    color = MaterialTheme.colors.surface, // color will be adjusted for elevation
    /*...*/
) { /*...*/ }

অ্যাপের স্ক্রিনশট, যেখানে বিভিন্ন উচ্চতার লেভেলে এলিমেন্টের জন্য ব্যবহৃত সূক্ষ্মভাবে আলাদা রঙ দেখানো হচ্ছে
ছবি ৫. কার্ড ও নিচের দিকে নেভিগেশন, দুটিই ব্যাকগ্রাউন্ড হিসেবে surface রঙ ব্যবহার করছে। কার্ড এবং নিচের দিকে নেভিগেশন ব্যাকগ্রাউন্ডের উপরে বিভিন্ন উচ্চতার লেভেলে থাকার কারণে, তাদের রঙ কিছুটা আলাদা–কার্ডগুলি ব্যাকগ্রাউন্ডের চেয়ে হালকা এবং নিচের দিকে নেভিগেশন কার্ডের চেয়ে হালকা।

কাস্টম পরিস্থিতির জন্য যেখানে Surface নেই, সেখানে LocalElevationOverlay ব্যবহার করুন, CompositionLocal-এ ElevationOverlay আছে যা Surface কম্পোনেন্ট ব্যবহার করে:

// Elevation overlays
// Implemented in Surface (and any components that use it)
val color = MaterialTheme.colors.surface
val elevation = 4.dp
val overlaidColor = LocalElevationOverlay.current?.apply(
    color, elevation
)

এলিভেশন ওভারলে বন্ধ করতে, কম্পোজেবল হায়ারার্কিতে বেছে নেওয়া পয়েন্টে null প্রদান করুন:

MyTheme {
    CompositionLocalProvider(LocalElevationOverlay provides null) {
        // Content without elevation overlays
    }
}

সীমিত কালার অ্যাকসেন্ট

ডার্ক থিমের জন্য Material সীমিত কালার অ্যাকসেন্ট প্রয়োগ করার সাজেশন দেয়। বেশিরভাগ ক্ষেত্রে primary রঙের পরিবর্তে surface রঙ ব্যবহার করার সাজেশন দেওয়া হয়। TopAppBar এবং BottomNavigation-এর মতো মেটেরিয়াল কম্পোজেবল ডিফল্ট হিসেবে এই আচরণ প্রয়োগ করে।

মেটেরিয়াল ডার্ক থিমের স্ক্রিনশট, যেখানে সীমিত কালার অ্যাকসেন্টের জন্য প্রাথমিক রঙের পরিবর্তে সারফেস কালার ব্যবহার করে অ্যাপের উপরের বার দেখানো হয়েছে
ছবি ৬. সীমিত কালার অ্যাকসেন্ট সহ মেটেরিয়াল ডার্ক থিম। লাইট থিমে উপরের অ্যাপ বার প্রাইমারি রঙ এবং ডার্ক থিমে সারফেস রঙ ব্যবহার করে।

কাস্টম সিনারিওর জন্য, primarySurface এক্সটেনশন প্রপার্টি ব্যবহার করুন:

Surface(
    // Switches between primary in light theme and surface in dark theme
    color = MaterialTheme.colors.primarySurface,
    /*...*/
) { /*...*/ }

টাইপোগ্রাফি

মেটেরিয়াল একটি টাইপ সিস্টেম সংজ্ঞায়িত করে, যা আপনাকে অল্প সংখ্যক অর্থগতভাবে-নামযুক্ত স্টাইল ব্যবহার করতে উৎসাহিত করে।

বিভিন্ন স্টাইলে একাধিক আলাদা টাইপফেসের উদাহরণ
ছবি ৭. মেটেরিয়াল টাইপ সিস্টেম।

Compose Typography, TextStyle এবং ফন্ট-সম্পর্কিত ক্লাসের সাথে টাইপ সিস্টেম প্রয়োগ করে। Typography কনস্ট্রাক্টর প্রতিটি স্টাইলের জন্য ডিফল্ট অফার করে যাতে আপনি কাস্টমাইজ করতে চান না এমন যেকোনও কিছু বাদ দিতে পারেন:

val raleway = FontFamily(
    Font(R.font.raleway_regular),
    Font(R.font.raleway_medium, FontWeight.W500),
    Font(R.font.raleway_semibold, FontWeight.SemiBold)
)

val myTypography = Typography(
    h1 = TextStyle(
        fontFamily = raleway,
        fontWeight = FontWeight.W300,
        fontSize = 96.sp
    ),
    body1 = TextStyle(
        fontFamily = raleway,
        fontWeight = FontWeight.W600,
        fontSize = 16.sp
    )
    /*...*/
)
MaterialTheme(typography = myTypography, /*...*/) {
    /*...*/
}

আপনি যদি সব জায়গায় একই টাইপফেস ব্যবহার করতে চান, তাহলে defaultFontFamily প্যারামিটার উল্লেখ করুন এবং যেকোনও TextStyle এলিমেন্টের fontFamily বাদ দিন:

val typography = Typography(defaultFontFamily = raleway)
MaterialTheme(typography = typography, /*...*/) {
    /*...*/
}

টেক্সট স্টাইল ব্যবহার করুন

TextStyleটি এলিমেন্ট MaterialTheme.typography ব্যবহার করে অ্যাক্সেস করা হয়েছে। TextStyle এলিমেন্ট নিম্নলিখিত উপায়ে ফিরিয়ে আনুন:

Text(
    text = "Subtitle2 styled",
    style = MaterialTheme.typography.subtitle2
)

বিভিন্ন উদ্দেশ্যে বিভিন্ন ধরনের টাইপফেসের মিশ্রণ দেখানো স্ক্রিনশট
ছবি ৮. আপনার ব্র্যান্ডকে প্রকাশ করতে বিভিন্ন ধরনের টাইপফেস ও স্টাইল ব্যবহার করুন।

আকার

মেটেরিয়াল একটি শেপ সিস্টেম সংজ্ঞায়িত করে, যা আপনাকে বড়, মাঝারি ও ছোট কম্পোনেন্টের জন্য শেপ সংজ্ঞায়িত করতে দেয়।

বিভিন্ন ধরনের মেটেরিয়াল ডিজাইন আকার দেখায়
ছবি ৯. মেটেরিয়াল শেপ সিস্টেম।

Compose Shapes ক্লাসের মাধ্যমে শেপ সিস্টেম প্রয়োগ করে, যা আপনাকে প্রতিটি সাইজ ক্যাটেগরির জন্য একটি CornerBasedShape নির্দিষ্ট করতে দেয়:

val shapes = Shapes(
    small = RoundedCornerShape(percent = 50),
    medium = RoundedCornerShape(0f),
    large = CutCornerShape(
        topStart = 16.dp,
        topEnd = 0.dp,
        bottomEnd = 0.dp,
        bottomStart = 16.dp
    )
)

MaterialTheme(shapes = shapes, /*...*/) {
    /*...*/
}

অনেক কম্পোনেন্ট ডিফল্ট হিসেবে এইসব আকার ব্যবহার করে। যেমন, Button, TextField এবং FloatingActionButton ডিফল্ট হিসেবে ছোট, AlertDialog ডিফল্ট হিসেবে মাঝারি এবং ModalDrawer ডিফল্ট হিসেবে বড় — সম্পূর্ণ ম্যাপিংয়ের জন্য শেপ স্কিম রেফারেন্স দেখুন।

আকার ব্যবহার করুন

MaterialTheme.shapes ব্যবহার করে Shapeটি এলিমেন্ট অ্যাক্সেস করা হয়েছে। এই ধরনের কোড ব্যবহার করে Shape এলিমেন্ট ফিরিয়ে আনুন:

Surface(
    shape = MaterialTheme.shapes.medium, /*...*/
) {
    /*...*/
}

কোনও এলিমেন্ট কোন অবস্থায় আছে তা বোঝাতে মেটেরিয়াল শেপ ব্যবহার করে এমন অ্যাপের স্ক্রিনশট
ছবি ১০. ব্র্যান্ড বা অবস্থা বোঝাতে আকার ব্যবহার করুন।

ডিফল্ট স্টাইল

Android Views থেকে ডিফল্ট স্টাইল-এর Compose-এ কোনও সমতুল্য ধারণা নেই। আপনি নিজের overload কম্পোজেবল ফাংশন তৈরি করে একই ধরনের কার্যকারিতা প্রদান করতে পারেন যা মেটেরিয়াল কম্পোনেন্টকে র‍্যাপ করে। যেমন, একটি স্টাইলের বোতাম তৈরি করতে, আপনার নিজের কম্পোজেবল ফাংশনে একটি বোতাম র‍্যাপ করুন, সরাসরি আপনি যে প্যারামিটারগুলি পরিবর্তন করতে চান বা প্রয়োজন সেগুলি সেট করুন এবং অন্যদের প্যারামিটার হিসাবে কম্পোজেবল ধারণ করার জন্য প্রকাশ করুন।

@Composable
fun MyButton(
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    content: @Composable RowScope.() -> Unit
) {
    Button(
        colors = ButtonDefaults.buttonColors(
            backgroundColor = MaterialTheme.colors.secondary
        ),
        onClick = onClick,
        modifier = modifier,
        content = content
    )
}

থিম ওভারলে

আপনি MaterialTheme কম্পোজেবল নেস্ট করার মাধ্যমে Compose-এ Android Views থেকে থিম ওভারলে-এর সমতুল্য ফলাফল পেতে পারেন। যেহেতু MaterialTheme বর্তমান থিম ভ্যালুতে রঙ, টাইপোগ্রাফি ও আকার ডিফল্ট হিসেবে সেট করে, তাই থিম শুধুমাত্র এইসব প্যারামিটারের মধ্যে একটি সেট করলে, অন্য সব প্যারামিটার তাদের ডিফল্ট ভ্যালু বজায় রাখে।

এছাড়াও, View-ভিত্তিক স্ক্রিন Compose-এ মাইগ্রেট করার সময়, android:theme অ্যাট্রিবিউটের ব্যবহার সম্পর্কে সতর্ক থাকুন। সম্ভবত Compose UI ট্রির ওই অংশে আপনার একটি নতুন MaterialTheme প্রয়োজন।

এই উদাহরণে, স্ক্রিনের বেশিরভাগ অংশের জন্য বিবরণ স্ক্রিন PinkTheme ব্যবহার করে, এবং তারপরে সম্পর্কিত বিভাগের জন্য BlueTheme ব্যবহার করে। নিম্নলিখিত স্ক্রিনশট ও কোড এই ধারণাটি ব্যাখ্যা করে:

নেস্টেড থিম দেখানো একটি অ্যাপের স্ক্রিনশট, যেখানে মূল স্ক্রিনের জন্য একটি গোলাপি থিম এবং একটি সম্পর্কিত বিভাগের জন্য একটি নীল থিম রয়েছে
ছবি ১১. নেস্টেড থিম।

@Composable
fun DetailsScreen(/* ... */) {
    PinkTheme {
        // other content
        RelatedSection()
    }
}

@Composable
fun RelatedSection(/* ... */) {
    BlueTheme {
        // content
    }
}

কম্পোনেন্টের স্ট্যাটাস

মেটেরিয়াল কম্পোনেন্ট যেগুলির সাথে ইন্টার‍্যাক্ট করা যায় (ক্লিক করা, টগল করা ইত্যাদি) সেগুলি বিভিন্ন ভিজ্যুয়াল স্টেটে থাকতে পারে। স্টেটের মধ্যে চালু, বন্ধ, প্রেস করা ইত্যাদি অন্তর্ভুক্ত।

কম্পোজেবলে প্রায়ই enabled প্যারামিটার থাকে। এটি false-এ সেট করলে ইন্টার‍্যাকশন বন্ধ হয়ে যায় এবং কম্পোনেন্টের স্ট্যাটাস ভিজ্যুয়ালি বোঝানোর জন্য রঙ ও এলিভেশনের মতো প্রপার্টি পরিবর্তন করে।

দুটি বোতামের স্ক্রিনশট: একটি চালু, একটি বন্ধ, তাদের বিভিন্ন ভিজ্যুয়াল অবস্থা দেখাচ্ছে
ছবি ১২. enabled = true (বাঁদিকে) এবং enabled = false (ডানদিকে) সহ বোতাম।

বেশিরভাগ ক্ষেত্রে, আপনি রঙ এবং উচ্চতার মতো ভ্যালুর জন্য ডিফল্ট সেটিংসের উপর নির্ভর করতে পারেন। বিভিন্ন স্টেটে ব্যবহৃত ভ্যালু কনফিগার করতে হলে, ক্লাস ও কনভেনিয়েন্স ফাংশন উপলভ্য আছে। বোতামের নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

Button(
    onClick = { /* ... */ },
    enabled = true,
    // Custom colors for different states
    colors = ButtonDefaults.buttonColors(
        backgroundColor = MaterialTheme.colors.secondary,
        disabledBackgroundColor = MaterialTheme.colors.onBackground
            .copy(alpha = 0.2f)
            .compositeOver(MaterialTheme.colors.background)
        // Also contentColor and disabledContentColor
    ),
    // Custom elevation for different states
    elevation = ButtonDefaults.elevation(
        defaultElevation = 8.dp,
        disabledElevation = 2.dp,
        // Also pressedElevation
    )
) { /* ... */ }

চালু ও বন্ধ থাকা অবস্থার জন্য অ্যাডজাস্ট করা রঙ ও উচ্চতা সহ দুটি বোতামের স্ক্রিনশট
ছবি ১৩. enabled = true (বাঁদিকে) এবং enabled = false (ডানদিকে) সহ বোতাম, অ্যাডজাস্ট করা রঙ এবং এলিভেশন ভ্যালু সহ।

লহর

মেটেরিয়াল কম্পোনেন্ট রিপল ব্যবহার করে দেখায় যে সেগুলির সাথে ইন্টার‍্যাক্ট করা হচ্ছে। আপনি হায়ারার্কিতে MaterialTheme ব্যবহার করলে, clickable ও indication-এর মতো মডিফায়ারের মধ্যে ডিফল্ট Indication হিসেবে Ripple ব্যবহার করা হয়।

বেশিরভাগ ক্ষেত্রে আপনি ডিফল্ট Ripple-এর উপর নির্ভর করতে পারেন। আপনি যদি তাদের চেহারা কনফিগার করতে চান, তাহলে আপনি রঙ এবং আলফার মতো বৈশিষ্ট্য পরিবর্তন করতে RippleTheme ব্যবহার করতে পারেন।

আপনি RippleTheme এক্সটেন্ড করতে এবং defaultRippleColor ও defaultRippleAlpha ইউটিলিটি ফাংশন ব্যবহার করতে পারবেন। আপনি তারপর LocalRippleTheme ব্যবহার করে আপনার হায়ারার্কিতে কাস্টম রিপল থিম প্রদান করতে পারেন:

@Composable
fun MyApp() {
    MaterialTheme {
        CompositionLocalProvider(
            LocalRippleTheme provides SecondaryRippleTheme
        ) {
            // App content
        }
    }
}

@Immutable
private object SecondaryRippleTheme : RippleTheme {
    @Composable
    override fun defaultColor() = RippleTheme.defaultRippleColor(
        contentColor = MaterialTheme.colors.secondary,
        lightTheme = MaterialTheme.colors.isLight
    )

    @Composable
    override fun rippleAlpha() = RippleTheme.defaultRippleAlpha(
        contentColor = MaterialTheme.colors.secondary,
        lightTheme = MaterialTheme.colors.isLight
    )
}

অ্যানিমেটেড GIF-এ ট্যাপ করা হলে বিভিন্ন রিপল এফেক্ট সহ বোতাম দেখানো হচ্ছে
ছবি ১৪. RippleConfiguration ব্যবহার করে বিভিন্ন রিপল ভ্যালু সহ বোতাম প্রদান করা হয়েছে।

আরও জানুন

Compose-এ মেটিরিয়াল থিমিং সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন।

কোডল্যাবস

ভিডিও