জেটপ্যাক কম্পোজ ম্যাটেরিয়াল ডিজাইনের বাস্তবায়ন অফার করে, ডিজিটাল ইন্টারফেস তৈরির জন্য একটি ব্যাপক ডিজাইন সিস্টেম। মেটেরিয়াল ডিজাইনের উপাদানগুলি (বোতাম, কার্ড, সুইচ এবং আরও) ম্যাটেরিয়াল থিমিংয়ের উপরে তৈরি করা হয়, যা আপনার পণ্যের ব্র্যান্ডকে আরও ভালভাবে প্রতিফলিত করার জন্য উপাদান ডিজাইন কাস্টমাইজ করার একটি পদ্ধতিগত উপায়। একটি উপাদান থিমে রঙ , টাইপোগ্রাফি এবং আকৃতির বৈশিষ্ট্য রয়েছে। আপনি যখন এই বৈশিষ্ট্যগুলি কাস্টমাইজ করেন, তখন আপনার পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে প্রতিফলিত হয় যে উপাদানগুলি আপনি আপনার অ্যাপ তৈরি করতে ব্যবহার করেন৷
জেটপ্যাক কম্পোজ MaterialTheme
কম্পোজেবলের সাথে এই ধারণাগুলি প্রয়োগ করে:
MaterialTheme( colors = // ... typography = // ... shapes = // ... ) { // app content }
আপনার অ্যাপ্লিকেশন থিম করার জন্য MaterialTheme
এ আপনি পাস করা প্যারামিটারগুলি কনফিগার করুন।
চিত্র 1. প্রথম স্ক্রিনশটটি এমন একটি অ্যাপ দেখায় যা MaterialTheme
কনফিগার করে না, এবং তাই এটি ডিফল্ট স্টাইলিং ব্যবহার করে। দ্বিতীয় স্ক্রিনশটটি এমন একটি অ্যাপ দেখায় যা স্টাইল কাস্টমাইজ করতে MaterialTheme
পরামিতি পাস করে।
রঙ
রঙগুলিকে Color
ক্লাসের সাথে কম্পোজে মডেল করা হয়েছে, একটি সাধারণ ডেটা-ধারণকারী ক্লাস।
val Red = Color(0xffff0000) val Blue = Color(red = 0f, green = 0f, blue = 1f)
যদিও আপনি এগুলিকে আপনার পছন্দ মতো সাজাতে পারেন (শীর্ষ-স্তরের ধ্রুবক হিসাবে, একটি সিঙ্গলটনের মধ্যে, বা সংজ্ঞায়িত ইনলাইনে), আমরা দৃঢ়ভাবে আপনার থিমে রঙগুলি নির্দিষ্ট করার এবং সেখান থেকে রঙগুলি পুনরুদ্ধার করার পরামর্শ দিই৷ এই পন্থাটি সহজেই অন্ধকার থিম এবং নেস্টেড থিমগুলিকে সমর্থন করা সম্ভব করে তোলে।
চিত্র 2. উপাদান রঙ সিস্টেম.
কম্পোজ উপাদানের রঙ সিস্টেমের মডেল করার জন্য 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
তার রঙ সেট করতে সেই রঙটি ব্যবহার করে।
চিত্র 3. বিভিন্ন পটভূমির রঙ সেট করা বিভিন্ন পাঠ্য এবং আইকন রঙ তৈরি করে।
contentColorFor()
পদ্ধতি যেকোনো থিমের রঙের জন্য উপযুক্ত "চালু" রঙ পুনরুদ্ধার করে। উদাহরণস্বরূপ, যদি আপনি Surface
এ একটি primary
পটভূমির রঙ সেট করেন, তাহলে এটি এই ফাংশনটি ব্যবহার করে onPrimary
বিষয়বস্তুর রঙ হিসেবে সেট করতে। আপনি যদি একটি নন-থিম পটভূমির রঙ সেট করেন, তাহলে আপনাকে একটি উপযুক্ত বিষয়বস্তুর রঙও নির্দিষ্ট করতে হবে। অনুক্রমের একটি নির্দিষ্ট অবস্থানে, বর্তমান পটভূমির জন্য পছন্দের বিষয়বস্তুর রঙ পুনরুদ্ধার করতে LocalContentColor
ব্যবহার করুন।
বিষয়বস্তু আলফা
প্রায়শই আপনি গুরুত্বের সাথে যোগাযোগ করতে এবং ভিজ্যুয়াল শ্রেণিবিন্যাস প্রদানের জন্য বিষয়বস্তুর উপর কতটা জোর দেন তা পরিবর্তন করতে চান। মেটেরিয়াল ডিজাইন টেক্সট লেজিবিলিটি সুপারিশ বিভিন্ন গুরুত্বের মাত্রা বোঝাতে বিভিন্ন স্তরের অস্বচ্ছতা নিয়োগের পরামর্শ দেয়।
Jetpack Compose এটিকে LocalContentAlpha
এর মাধ্যমে প্রয়োগ করে। আপনি এই CompositionLocal
এর জন্য একটি মান প্রদান করে একটি অনুক্রমের জন্য একটি বিষয়বস্তু আলফা নির্দিষ্ট করতে পারেন। নেস্টেড কম্পোজেবলগুলি তাদের সামগ্রীতে আলফা চিকিত্সা প্রয়োগ করতে এই মানটি ব্যবহার করতে পারে। উদাহরণস্বরূপ, Text
এবং Icon
ডিফল্টভাবে LocalContentAlpha
ব্যবহার করার জন্য সামঞ্জস্য করা LocalContentColor
এর সমন্বয় ব্যবহার করে। উপাদান কিছু স্ট্যান্ডার্ড আলফা মান ( 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 গাইডের সাথে স্থানীয়ভাবে স্কোপড ডেটা দেখুন।
চিত্র 4. তথ্য শ্রেণীবিন্যাস দৃশ্যমানভাবে যোগাযোগ করতে পাঠ্যের উপর বিভিন্ন স্তরের জোর প্রয়োগ করুন। পাঠ্যের প্রথম লাইনটি শিরোনাম এবং এতে সবচেয়ে গুরুত্বপূর্ণ তথ্য রয়েছে এবং এইভাবে ContentAlpha.high
ব্যবহার করে। দ্বিতীয় লাইনে কম-গুরুত্বপূর্ণ মেটাডেটা রয়েছে এবং এইভাবে ContentAlpha.medium
ব্যবহার করে।
গাঢ় থিম
কম্পোজে, আপনি 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" )
উচ্চতা ওভারলে
উপাদানে, উচ্চতর উচ্চতার সাথে গাঢ় থিমের পৃষ্ঠগুলি উচ্চতা ওভারলে প্রাপ্ত করে, যা তাদের পটভূমিকে হালকা করে। একটি পৃষ্ঠের উচ্চতা যত বেশি হবে (একটি উহ্য আলোর উত্সের কাছাকাছি বাড়াবে), পৃষ্ঠটি তত হালকা হবে।
এই ওভারলেগুলি গাঢ় রং ব্যবহার করার সময় Surface
কম্পোজেবল দ্বারা স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয়, এবং অন্য যেকোন উপাদানের জন্য যা একটি পৃষ্ঠ ব্যবহার করে:
Surface( elevation = 2.dp, color = MaterialTheme.colors.surface, // color will be adjusted for elevation /*...*/ ) { /*...*/ }
চিত্র 5. কার্ড এবং নীচের নেভিগেশন উভয়ই তাদের পটভূমি হিসাবে surface
রঙ ব্যবহার করছে। যেহেতু কার্ড এবং নীচের নেভিগেশনগুলি ব্যাকগ্রাউন্ডের উপরে বিভিন্ন উচ্চতার স্তরে রয়েছে, সেগুলির রঙ কিছুটা আলাদা - কার্ডগুলি ব্যাকগ্রাউন্ডের চেয়ে হালকা এবং নীচের নেভিগেশনটি কার্ডের চেয়ে হালকা।
Surface
জড়িত নয় এমন কাস্টম পরিস্থিতিগুলির জন্য, LocalElevationOverlay
ব্যবহার করুন, একটি CompositionLocal
যার মধ্যে Surface
উপাদানগুলির দ্বারা ব্যবহৃত ElevationOverlay
রয়েছে:
// 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 } }
সীমিত রঙের উচ্চারণ
উপাদান বেশিরভাগ ক্ষেত্রে primary
রঙের চেয়ে surface
রঙের ব্যবহারকে পছন্দ করে গাঢ় থিমের জন্য সীমিত রঙের উচ্চারণ প্রয়োগ করার পরামর্শ দেয়। TopAppBar
এবং BottomNavigation
এর মত উপাদান কম্পোজেবল এই আচরণটি ডিফল্টরূপে প্রয়োগ করে।
চিত্র 6. সীমিত রঙের উচ্চারণ সহ উপাদান গাঢ় থিম। শীর্ষ অ্যাপ বার হালকা থিমে প্রাথমিক রঙ এবং অন্ধকার থিমে পৃষ্ঠের রঙ ব্যবহার করে।
কাস্টম পরিস্থিতিতে জন্য, primarySurface
এক্সটেনশন সম্পত্তি ব্যবহার করুন:
Surface( // Switches between primary in light theme and surface in dark theme color = MaterialTheme.colors.primarySurface, /*...*/ ) { /*...*/ }
টাইপোগ্রাফি
উপাদান একটি টাইপ সিস্টেমকে সংজ্ঞায়িত করে, আপনাকে অল্প সংখ্যক শব্দার্থক-নামযুক্ত শৈলী ব্যবহার করতে উত্সাহিত করে।
চিত্র 7. উপাদান টাইপ সিস্টেম.
কম্পোজ 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 parameter
নির্দিষ্ট করুন এবং যেকোন TextStyle
উপাদানের fontFamily
বাদ দিন:
val typography = Typography(defaultFontFamily = raleway) MaterialTheme(typography = typography, /*...*/) { /*...*/ }
পাঠ্য শৈলী ব্যবহার করে
TextStyle
MaterialTheme.typography
এর মাধ্যমে অ্যাক্সেস করা হয়। এর মতো TextStyle
পুনরুদ্ধার করুন:
Text( text = "Subtitle2 styled", style = MaterialTheme.typography.subtitle2 )
চিত্র 8. আপনার ব্র্যান্ড প্রকাশ করতে টাইপফেস এবং শৈলীর একটি নির্বাচন ব্যবহার করুন।
আকৃতি
উপাদান একটি আকৃতির সিস্টেমকে সংজ্ঞায়িত করে, যা আপনাকে বড়, মাঝারি এবং ছোট উপাদানগুলির জন্য আকার নির্ধারণ করতে দেয়।
চিত্র 9. উপাদান আকৃতি সিস্টেম.
কম্পোজ 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
s পুনরুদ্ধার করুন:
Surface( shape = MaterialTheme.shapes.medium, /*...*/ ) { /*...*/ }
চিত্র 10. ব্র্যান্ড বা রাষ্ট্র প্রকাশ করতে আকার ব্যবহার করুন।
ডিফল্ট শৈলী
অ্যান্ড্রয়েড ভিউ থেকে ডিফল্ট শৈলীর রচনায় কোন সমতুল্য ধারণা নেই। আপনি আপনার নিজস্ব 'ওভারলোড' কম্পোজেবল ফাংশন তৈরি করে অনুরূপ কার্যকারিতা প্রদান করতে পারেন যা উপাদান উপাদানগুলিকে মোড়ানো থাকে। উদাহরণস্বরূপ, বোতামের একটি শৈলী তৈরি করতে, আপনার নিজস্ব কম্পোজেবল ফাংশনে একটি বোতাম মোড়ানো, আপনি যে প্যারামিটারগুলি পরিবর্তন করতে চান তা সরাসরি সেট করুন এবং কম্পোজেবল ধারণ করার পরামিতি হিসাবে অন্যদের প্রকাশ করুন।
@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
composables নেস্টিং করে কম্পোজে Android ভিউ থেকে থিম ওভারলেগুলির সমতুল্য অর্জন করতে পারেন৷ যেহেতু MaterialTheme
বর্তমান থিমের মান অনুযায়ী রঙ, টাইপোগ্রাফি এবং আকারগুলিকে ডিফল্ট করে, যদি একটি থিম শুধুমাত্র এই প্যারামিটারগুলির একটি সেট করে, অন্যান্য পরামিতিগুলি তাদের ডিফল্ট মান রাখে।
অধিকন্তু, যখন ভিউ-ভিত্তিক স্ক্রীনগুলি রচনায় স্থানান্তরিত করা হয়, তখন android:theme
বৈশিষ্ট্যের ব্যবহারগুলির দিকে লক্ষ্য রাখুন৷ কম্পোজ UI ট্রির সেই অংশে আপনার সম্ভবত একটি নতুন MaterialTheme
দরকার।
এই উদাহরণে, বিশদ স্ক্রীনটি বেশিরভাগ স্ক্রিনের জন্য একটি PinkTheme
এবং তারপরে সম্পর্কিত বিভাগের জন্য একটি BlueTheme
ব্যবহার করে। নীচের স্ক্রিনশট এবং কোড দেখুন।
চিত্র 11. নেস্টেড থিম।
@Composable fun DetailsScreen(/* ... */) { PinkTheme { // other content RelatedSection() } } @Composable fun RelatedSection(/* ... */) { BlueTheme { // content } }
উপাদান রাষ্ট্র
উপাদান উপাদান যেগুলির সাথে ইন্টারঅ্যাক্ট করা যেতে পারে (ক্লিক করা, টগল করা ইত্যাদি) বিভিন্ন ভিজ্যুয়াল অবস্থায় থাকতে পারে। রাজ্যগুলি সক্রিয়, অক্ষম, চাপা ইত্যাদি অন্তর্ভুক্ত করে।
কম্পোজেবলের প্রায়ই একটি enabled
প্যারামিটার থাকে। এটিকে false
সেট করা মিথস্ক্রিয়াকে বাধা দেয় এবং উপাদানের অবস্থাকে দৃশ্যমানভাবে বোঝাতে রঙ এবং উচ্চতার মতো বৈশিষ্ট্যগুলি পরিবর্তন করে।
চিত্র 12. 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 ) ) { /* ... */ }
চিত্র 13. enabled = true
(বাম) এবং enabled = false
(ডান), সমন্বয় করা রঙ এবং উচ্চতার মান সহ বোতাম।
লহর
উপাদান উপাদানগুলি তাদের সাথে ইন্টারঅ্যাক্ট করা হচ্ছে তা বোঝাতে তরঙ্গ ব্যবহার করে। আপনি যদি আপনার শ্রেণিবিন্যাসে MaterialTheme
ব্যবহার করেন, তাহলে একটি Ripple
পরিবর্তনকারীর ভিতরে ডিফল্ট Indication
হিসাবে ব্যবহার করা হবে যেমন clickable
এবং indication
।
বেশিরভাগ ক্ষেত্রে আপনি ডিফল্ট 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 ) }
চিত্র 14. RippleTheme
এর মাধ্যমে প্রদান করা বিভিন্ন রিপল মান সহ বোতাম।
আরও জানুন
রচনায় উপাদান থিমিং সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন৷
কোডল্যাব
ভিডিও
{% শব্দার্থে %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়
- কম্পোজে কাস্টম ডিজাইন সিস্টেম
- রচনায় উপাদান 2 থেকে উপাদান 3 এ স্থানান্তর করুন৷
- রচনায় অ্যাক্সেসযোগ্যতা