متریال دیزاین 3 در Compose

Jetpack Compose پیاده‌سازی Material You و Material 3 Expressive ، تکامل بعدی طراحی متریال، را ارائه می‌دهد. M3 Expressive نسخه توسعه‌یافته Material Design 3 است که شامل به‌روزرسانی‌های مبتنی بر تحقیق در زمینه تم‌بندی، کامپوننت‌ها، حرکت، تایپوگرافی و موارد دیگر می‌شود - همه این‌ها برای کمک به شما در ساخت محصولات جذاب و مطلوبی که کاربران دوست دارند طراحی شده‌اند. همچنین از ویژگی‌های شخصی‌سازی Material You مانند رنگ پویا پشتیبانی می‌کند. M3 Expressive مکمل سبک بصری و رابط کاربری سیستم اندروید ۱۶ است.

در زیر، پیاده‌سازی طراحی متریال ۳ را با استفاده از برنامه نمونه پاسخ (Reply) به عنوان مثال نشان می‌دهیم. نمونه پاسخ کاملاً مبتنی بر طراحی متریال ۳ است.

پاسخ به نمونه برنامه با استفاده از طراحی متریال ۳
شکل 1. نمونه برنامه پاسخ با استفاده از طراحی متریال 3

وابستگی

برای شروع استفاده از Material 3 در برنامه Compose خود، وابستگی Compose Material 3 را به فایل‌های build.gradle خود اضافه کنید:

implementation "androidx.compose.material3:material3:$material3_version"

پس از افزودن وابستگی، می‌توانید سیستم‌های طراحی متریال، از جمله رنگ، تایپوگرافی و شکل را به برنامه‌های خود اضافه کنید.

API های آزمایشی

برخی از APIهای M3 آزمایشی در نظر گرفته می‌شوند. در چنین مواردی، باید با استفاده از حاشیه‌نویسی ExperimentalMaterial3Api در سطح تابع یا فایل، این قابلیت را فعال کنید:

// import androidx.compose.material3.ExperimentalMaterial3Api
@Composable
fun AppComposable() {
    // M3 composables
}

قالب‌بندی متریال

یک قالب M3 شامل زیرسیستم‌های زیر است: طرح رنگ ، تایپوگرافی و شکل‌ها . وقتی این مقادیر را سفارشی می‌کنید، تغییرات شما به طور خودکار در کامپوننت‌های M3 که برای ساخت برنامه خود استفاده می‌کنید، منعکس می‌شود.

زیرسیستم‌های طراحی متریال: رنگ، تایپوگرافی و اشکال
شکل 2. زیرسیستم‌های طراحی متریال: رنگ، تایپوگرافی و اشکال

Jetpack Compose این مفاهیم را با M3 MaterialTheme composable پیاده‌سازی می‌کند:

MaterialTheme(
    colorScheme = /* ...
    typography = /* ...
    shapes = /* ...
) {
    // M3 app content
}

برای تم‌بندی محتوای برنامه خود، طرح رنگ، تایپوگرافی و شکل‌های خاص برنامه خود را تعریف کنید.

طرح رنگ

پایه و اساس یک طرح رنگی، مجموعه‌ای از پنج رنگ کلیدی است. هر یک از این رنگ‌ها به یک پالت رنگی ۱۳ تایی مربوط می‌شوند که توسط اجزای Material 3 استفاده می‌شوند. به عنوان مثال، این طرح رنگی برای تم روشن برای پاسخ است:

پاسخ به نمونه طرح رنگ نور اپلیکیشن
شکل 3. طرح رنگ نور اپلیکیشن نمونه پاسخ

درباره طرح رنگ و نقش‌های رنگ بیشتر بخوانید.

تولید طرح‌های رنگی

اگرچه می‌توانید یک ColorScheme سفارشی را به صورت دستی ایجاد کنید، اما اغلب تولید آن با استفاده از رنگ‌های منبع از برند شما آسان‌تر است. ابزار Material Theme Builder به شما این امکان را می‌دهد و به صورت اختیاری کد قالب‌بندی Compose را صادر کنید. فایل‌های زیر تولید می‌شوند:

  • Color.kt شامل رنگ‌های قالب شما به همراه تمام نقش‌های تعریف‌شده برای رنگ‌های روشن و تیره قالب است.

val md_theme_light_primary = Color(0xFF476810)
val md_theme_light_onPrimary = Color(0xFFFFFFFF)
val md_theme_light_primaryContainer = Color(0xFFC7F089)
// ..
// ..

val md_theme_dark_primary = Color(0xFFACD370)
val md_theme_dark_onPrimary = Color(0xFF213600)
val md_theme_dark_primaryContainer = Color(0xFF324F00)
// ..
// ..

  • Theme.kt شامل تنظیماتی برای طرح‌های رنگی روشن و تیره و تم برنامه است.

private val LightColorScheme = lightColorScheme(
    primary = md_theme_light_primary,
    onPrimary = md_theme_light_onPrimary,
    primaryContainer = md_theme_light_primaryContainer,
    // ..
)
private val DarkColorScheme = darkColorScheme(
    primary = md_theme_dark_primary,
    onPrimary = md_theme_dark_onPrimary,
    primaryContainer = md_theme_dark_primaryContainer,
    // ..
)

@Composable
fun ReplyTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {
    val colorScheme =
        if (!darkTheme) {
            LightColorScheme
        } else {
            DarkColorScheme
        }
    MaterialTheme(
        colorScheme = colorScheme,
        content = content
    )
}

برای پشتیبانی از تم‌های روشن و تیره، از isSystemInDarkTheme() استفاده کنید. بر اساس تنظیمات سیستم، تعریف کنید که از کدام طرح رنگ استفاده شود: روشن یا تیره.

طرح‌های رنگی پویا

رنگ پویا بخش کلیدی Material You است که در آن یک الگوریتم، رنگ‌های سفارشی را از تصویر زمینه کاربر استخراج می‌کند تا در برنامه‌ها و رابط کاربری سیستم او اعمال شود. این پالت رنگ به عنوان نقطه شروع برای تولید طرح‌های رنگی روشن و تیره استفاده می‌شود.

پاسخ نمونه تم گذاری پویای برنامه از تصویر زمینه (چپ) و تم گذاری پیش فرض برنامه (راست)
شکل ۴. نمونه پاسخ، تم‌بندی پویای برنامه از تصویر زمینه (چپ) و تم‌بندی پیش‌فرض برنامه (راست)

رنگ پویا در اندروید ۱۲ و بالاتر در دسترس است. اگر رنگ پویا در دسترس باشد، می‌توانید یک ColorScheme پویا تنظیم کنید. در غیر این صورت، باید به استفاده از یک ColorScheme روشن یا تیره سفارشی برگردید.

ColorScheme توابع سازنده‌ای را برای ایجاد یک طرح رنگی روشن یا تیره پویا ارائه می‌دهد:

// Dynamic color is available on Android 12+
val dynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
val colors = when {
    dynamicColor && darkTheme -> dynamicDarkColorScheme(LocalContext.current)
    dynamicColor && !darkTheme -> dynamicLightColorScheme(LocalContext.current)
    darkTheme -> DarkColorScheme
    else -> LightColorScheme
}

استفاده از رنگ

شما می‌توانید از طریق MaterialTheme.colorScheme به رنگ‌های تم متریال در برنامه خود دسترسی داشته باشید:

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

هر نقش رنگی بسته به حالت، برجستگی و تأکید آن جزء، می‌تواند در مکان‌های متنوعی مورد استفاده قرار گیرد.

  • رنگ اصلی، رنگ پایه است که برای اجزای اصلی مانند دکمه‌های برجسته، حالت‌های فعال و رنگ سطوح مرتفع استفاده می‌شود.
  • رنگ کلید ثانویه برای اجزای کم‌اهمیت‌تر در رابط کاربری، مانند تراشه‌های فیلتر، استفاده می‌شود و امکان نمایش رنگ‌ها را گسترش می‌دهد.
  • رنگ کلیدی سوم برای استخراج نقش‌های متضاد رنگ‌های تأکیدی استفاده می‌شود که می‌توانند برای ایجاد تعادل بین رنگ‌های اولیه و ثانویه یا افزایش توجه به یک عنصر مورد استفاده قرار گیرند.

طراحی اپلیکیشن نمونه Reply از رنگ on-primary-container روی primary-container برای تأکید بر آیتم انتخاب شده استفاده می‌کند.

فیلدهای محفظه اصلی و متنی با رنگ محفظه اصلی.
شکل ۵. محفظه اصلی و فیلدهای متنی با رنگ محفظه اصلی.

Card(
    colors = CardDefaults.cardColors(
        containerColor =
        if (isSelected) MaterialTheme.colorScheme.primaryContainer
        else
            MaterialTheme.colorScheme.surfaceVariant
    )
) {
    Text(
        text = "Dinner club",
        style = MaterialTheme.typography.bodyLarge,
        color =
        if (isSelected) MaterialTheme.colorScheme.onPrimaryContainer
        else MaterialTheme.colorScheme.onSurface,
    )
}

اینجا می‌توانید در کشوی ناوبری پاسخ ببینید که چگونه از رنگ‌های ظرف ثانویه و ثالثیه در تضاد با هم برای ایجاد تأکید و جذابیت استفاده شده است.

ترکیب محفظه سوم و روی محفظه سوم برای دکمه اقدام شناور.
شکل ۶. ترکیب محفظه سوم و روی محفظه سوم برای دکمه اقدام شناور.

تایپوگرافی

طراحی متریال ۳ یک مقیاس نوع تعریف می‌کند، از جمله سبک‌های متنی که از طراحی متریال ۲ اقتباس شده‌اند. نامگذاری و گروه‌بندی به صورت ساده شده به این صورت است: نمایش، تیتر، عنوان، بدنه و برچسب، با اندازه‌های بزرگ، متوسط ​​و کوچک برای هر کدام.

مقیاس تایپوگرافی پیش‌فرض برای طراحی متریال ۳
شکل 7. مقیاس تایپوگرافی پیش‌فرض برای طراحی متریال 3
ام۳ اندازه فونت/ارتفاع خط پیش‌فرض
displayLarge Roboto 57/64
displayMedium Roboto 45/52
displaySmall Roboto 36/44
headlineLarge Roboto 32/40
headlineMedium Roboto 28/36
headlineSmall Roboto 24/32
titleLarge New- Roboto Medium 22/28
titleMedium Roboto Medium 16/24
titleSmall Roboto Medium 14/20
bodyLarge Roboto 16/24
bodyMedium Roboto 14/20
bodySmall Roboto 12/16
labelLarge Roboto Medium 14/20
labelMedium Roboto Medium 12/16
labelSmall New Roboto Medium, 11/16

تعریف تایپوگرافی

Compose کلاس M3 Typography را - به همراه کلاس‌های TextStyle و مرتبط با فونت موجود - برای مدل‌سازی مقیاس نوع Material 3 ارائه می‌دهد. سازنده Typography برای هر سبک، مقادیر پیش‌فرض ارائه می‌دهد، بنابراین می‌توانید هر پارامتری را که نمی‌خواهید سفارشی کنید، حذف کنید:

val replyTypography = Typography(
    titleLarge = TextStyle(
        fontWeight = FontWeight.SemiBold,
        fontSize = 22.sp,
        lineHeight = 28.sp,
        letterSpacing = 0.sp
    ),
    titleMedium = TextStyle(
        fontWeight = FontWeight.SemiBold,
        fontSize = 16.sp,
        lineHeight = 24.sp,
        letterSpacing = 0.15.sp
    ),
    // ..
)
// ..

بدنه بزرگ، بدنه متوسط ​​و برچسب متوسط ​​برای کاربردهای مختلف تایپوگرافی.
شکل ۸. بدنه بزرگ، بدنه متوسط ​​و برچسب متوسط ​​برای کاربردهای مختلف تایپوگرافی.

احتمالاً محصول شما به هر ۱۵ سبک پیش‌فرض از مقیاس نوع طراحی متریال نیاز نخواهد داشت. در این مثال، پنج اندازه برای یک مجموعه کاهش‌یافته انتخاب شده‌اند و بقیه حذف شده‌اند.

شما می‌توانید با تغییر مقادیر پیش‌فرض TextStyle و ویژگی‌های مربوط به فونت مانند fontFamily و letterSpacing ، تایپوگرافی خود را سفارشی کنید.

bodyLarge = TextStyle(
    fontWeight = FontWeight.Normal,
    fontFamily = FontFamily.SansSerif,
    fontStyle = FontStyle.Italic,
    fontSize = 16.sp,
    lineHeight = 24.sp,
    letterSpacing = 0.15.sp,
    baselineShift = BaselineShift.Subscript
),

پس از تعریف Typography خود، آن را به M3 MaterialTheme منتقل کنید:

MaterialTheme(
    typography = replyTypography,
) {
    // M3 app Content
}

استفاده از سبک‌های متن

شما می‌توانید تایپوگرافی ارائه شده به M3 MaterialTheme composable را با استفاده از MaterialTheme.typography بازیابی کنید:

Text(
    text = "Hello M3 theming",
    style = MaterialTheme.typography.titleLarge
)
Text(
    text = "you are learning typography",
    style = MaterialTheme.typography.bodyMedium
)

می‌توانید درباره دستورالعمل‌های متریال در مورد اعمال تایپوگرافی بیشتر بخوانید.

اشکال

سطوح مواد را می‌توان به شکل‌های مختلفی نمایش داد. شکل‌ها توجه را جلب می‌کنند، اجزا را شناسایی می‌کنند، حالت را منتقل می‌کنند و برند را بیان می‌کنند.

مقیاس شکل، سبک گوشه‌های ظرف را تعریف می‌کند و طیفی از گردی را از مربع تا کاملاً دایره‌ای ارائه می‌دهد.

تعریف اشکال

Compose کلاس M3 Shapes با پارامترهای توسعه‌یافته برای پشتیبانی از اشکال جدید M3 ارائه می‌دهد. مقیاس شکل M3 بیشتر شبیه مقیاس نوع است و طیف وسیعی از اشکال را در سراسر رابط کاربری امکان‌پذیر می‌کند.

اندازه‌های مختلفی از اشکال وجود دارد:

  • خیلی کوچک
  • کوچک
  • متوسط
  • بزرگ
  • خیلی بزرگ

به طور پیش‌فرض، هر شکل یک مقدار پیش‌فرض دارد، اما می‌توانید آن‌ها را لغو کنید:

val replyShapes = Shapes(
    extraSmall = RoundedCornerShape(4.dp),
    small = RoundedCornerShape(8.dp),
    medium = RoundedCornerShape(12.dp),
    large = RoundedCornerShape(16.dp),
    extraLarge = RoundedCornerShape(24.dp)
)

پس از تعریف Shapes ، می‌توانید آن را به M3 MaterialTheme ارسال کنید:

MaterialTheme(
    shapes = replyShapes,
) {
    // M3 app Content
}

از شکل‌ها استفاده کنید

شما می‌توانید مقیاس شکل را برای تمام اجزا در MaterialTheme سفارشی کنید یا می‌توانید این کار را بر اساس هر جزء انجام دهید.

شکل‌های متوسط ​​و بزرگ را با مقادیر پیش‌فرض اعمال کنید:

Card(shape = MaterialTheme.shapes.medium) { /* card content */ }
FloatingActionButton(
    shape = MaterialTheme.shapes.large,
    onClick = {
    }
) {
    /* fab content */
}

شکل متوسط ​​برای کارت و شکل بزرگ برای دکمه‌ی عملیاتی شناور در برنامه‌ی نمونه‌ی پاسخ.
شکل ۹. شکل متوسط ​​برای کارت و شکل بزرگ برای دکمه عملیاتی شناور در برنامه نمونه پاسخ

دو شکل دیگر وجود دارد - RectangleShape و CircleShape - که بخشی از Compose هستند. شکل مستطیل بدون شعاع حاشیه است و شکل دایره لبه‌های کاملاً دایره‌ای را نشان می‌دهد:

Card(shape = RectangleShape) { /* card content */ }
Card(shape = CircleShape) { /* card content */ }

مثال‌های زیر برخی از اجزا را با مقادیر شکل پیش‌فرض اعمال شده روی آنها نشان می‌دهند:

مقادیر پیش‌فرض شکل‌ها برای همه اجزای Material 3.
شکل ۱۰. مقادیر پیش‌فرض شکل‌ها برای همه اجزای Material 3.

می‌توانید درباره دستورالعمل‌های متریال در مورد اعمال شکل بیشتر بخوانید.

تأکید

تأکید در M3 با استفاده از تنوع رنگ و ترکیب‌های رنگی آن ارائه می‌شود. در M3، دو راه برای افزودن تأکید به رابط کاربری شما وجود دارد:

  • استفاده از رنگ‌های surface، surface-variant و background در کنار رنگ‌های on-surface، on-surface-variants از سیستم رنگ توسعه‌یافته M3. به عنوان مثال، surface می‌تواند با on-surface-variant و surface-variant می‌تواند با on-surface برای ایجاد سطوح مختلف تأکید استفاده شود.
استفاده از ترکیب رنگ‌های خنثی برای تأکید.
شکل ۱۱. استفاده از ترکیب رنگ‌های خنثی برای تأکید.
  • استفاده از وزن‌های فونت مختلف برای متن. در بالا، دیدید که می‌توانید وزن‌های سفارشی را برای مقیاس نوع ما برای ارائه تأکیدهای مختلف ارائه دهید.

bodyLarge = TextStyle(
    fontWeight = FontWeight.Bold
),
bodyMedium = TextStyle(
    fontWeight = FontWeight.Normal
)

ارتفاع

متریال ۳ عمدتاً با استفاده از پوشش‌های رنگی تُنال، ارتفاع را نشان می‌دهد. این یک روش جدید برای متمایز کردن ظروف و سطوح از یکدیگر است - افزایش تُنال تُنال علاوه بر سایه‌ها، از تُن برجسته‌تری نیز استفاده می‌کند.

ارتفاع تُن با ارتفاع سایه
شکل ۱۲. ارتفاع تُن با ارتفاع سایهE

پوشش‌های ارتفاعی در تم‌های تیره نیز در متریال ۳ به پوشش‌های رنگی تغییر یافته‌اند. رنگ پوشش از اسلات رنگ اصلی می‌آید.

ارتفاع سایه در مقابل ارتفاع تُن در طراحی متریال ۳
شکل ۱۳. ارتفاع سایه در مقابل ارتفاع تُن‌ها در طراحی متریال ۳

M3 Surface - که پشت اکثر اجزای M3 قرار دارد - از هر دو قابلیت تنظیم تُن و سایه پشتیبانی می‌کند:

Surface(
    modifier = Modifier,
    tonalElevation = /*...
    shadowElevation = /*...
) {
    Column(content = content)
}

اجزای مواد

طراحی متریال با مجموعه‌ای غنی از کامپوننت‌های متریال (مانند دکمه‌ها، چیپ‌ها، کارت‌ها، نوار ناوبری) ارائه می‌شود که از قالب‌بندی متریال پیروی می‌کنند و به شما کمک می‌کنند برنامه‌های طراحی متریال زیبایی بسازید. می‌توانید از همان ابتدا از کامپوننت‌ها با ویژگی‌های پیش‌فرض استفاده کنید.

Button(onClick = { /*..*/ }) {
    Text(text = "My Button")
}

M3 نسخه‌های زیادی از اجزای یکسان را ارائه می‌دهد که می‌توانند در نقش‌های مختلف و بر اساس تأکید و توجه مورد استفاده قرار گیرند.

تأکید دکمه از FAB، دکمه اصلی به دکمه متنی
شکل ۱۴. تأکید دکمه از FAB، دکمه اصلی به دکمه متنی
  • یک دکمه‌ی عملیاتی شناور توسعه‌یافته برای عملیاتی با بیشترین تأکید:

ExtendedFloatingActionButton(
    onClick = { /*..*/ },
    modifier = Modifier
) {
    Icon(
        imageVector = Icons.Default.Edit,
        contentDescription = stringResource(id = R.string.edit),
    )
    Text(
        text = stringResource(id = R.string.add_entry),
    )
}

  • یک دکمه‌ی توپر برای عملی با تأکید بالا:

Button(onClick = { /*..*/ }) {
    Text(text = stringResource(id = R.string.view_entry))
}

  • یک دکمه متنی برای یک اقدام با تأکید کم:

TextButton(onClick = { /*..*/ }) {
    Text(text = stringResource(id = R.string.replated_articles))
}

می‌توانید درباره دکمه‌های متریال و سایر کامپوننت‌ها بیشتر بخوانید. متریال ۳ مجموعه‌ای از کامپوننت‌های متنوع مانند دکمه‌ها، نوارهای اپلیکیشن و کامپوننت‌های ناوبری را ارائه می‌دهد که به‌طور خاص برای موارد استفاده و اندازه‌های مختلف صفحه نمایش طراحی شده‌اند.

متریال همچنین چندین کامپوننت ناوبری ارائه می‌دهد که به شما در پیاده‌سازی ناوبری، بسته به اندازه‌ها و حالت‌های مختلف صفحه نمایش، کمک می‌کنند.

NavigationBar برای دستگاه‌های جمع‌وجور و زمانی که می‌خواهید ۵ مقصد یا کمتر را هدف قرار دهید، استفاده می‌شود:

NavigationBar(modifier = Modifier.fillMaxWidth()) {
    Destinations.entries.forEach { replyDestination ->
        NavigationBarItem(
            selected = selectedDestination == replyDestination,
            onClick = { },
            icon = { }
        )
    }
}

NavigationRail برای تبلت‌ها یا تلفن‌های کوچک تا متوسط ​​در حالت افقی استفاده می‌شود. این ابزار ارگونومی را برای کاربران فراهم می‌کند و تجربه کاربری را برای این دستگاه‌ها بهبود می‌بخشد.

NavigationRail(
    modifier = Modifier.fillMaxHeight(),
) {
    Destinations.entries.forEach { replyDestination ->
        NavigationRailItem(
            selected = selectedDestination == replyDestination,
            onClick = { },
            icon = { }
        )
    }
}

ویترین پاسخ BottomNavigationBar (چپ) و NavigationRail (راست)
شکل ۱۵. ویترین پاسخ BottomNavigationBar (چپ) و NavigationRail (راست)

با استفاده از هر دو قالب پیش‌فرض، پاسخ دهید تا تجربه کاربری فراگیری را برای همه اندازه‌های دستگاه ارائه دهید.

NavigationDrawer برای تبلت‌های با اندازه متوسط ​​تا بزرگ که فضای کافی برای نمایش جزئیات دارند، استفاده می‌شود. می‌توانید از PermanentNavigationDrawer یا ModalNavigationDrawer به همراه NavigationRail استفاده کنید.

PermanentNavigationDrawer(modifier = Modifier.fillMaxHeight(), drawerContent = {
    Destinations.entries.forEach { replyDestination ->
        NavigationRailItem(
            selected = selectedDestination == replyDestination,
            onClick = { },
            icon = { },
            label = { }
        )
    }
}) {
}

ویترین پاسخ کشوی ناوبری دائمی
شکل ۱۶. ویترین پاسخ کشوی ناوبری دائمی

گزینه‌های ناوبری، تجربه کاربری، ارگونومی و دسترسی‌پذیری را بهبود می‌بخشند. می‌توانید در آزمایشگاه کد تطبیقی ​​Compose درباره اجزای ناوبری متریال بیشتر بیاموزید.

سفارشی‌سازی قالب‌بندی یک کامپوننت

M3 شخصی‌سازی و انعطاف‌پذیری را تشویق می‌کند. همه اجزا رنگ‌های پیش‌فرض دارند، اما در صورت لزوم، APIهای انعطاف‌پذیری را برای سفارشی‌سازی رنگ‌هایشان در اختیار قرار می‌دهد.

بیشتر کامپوننت‌ها، مانند کارت‌ها و دکمه‌ها، یک شیء پیش‌فرض ارائه می‌دهند که رابط‌های رنگ و ارتفاع را نمایش می‌دهد و می‌توان آن را برای سفارشی‌سازی کامپوننت خود تغییر داد:

val customCardColors = CardDefaults.cardColors(
    contentColor = MaterialTheme.colorScheme.primary,
    containerColor = MaterialTheme.colorScheme.primaryContainer,
    disabledContentColor = MaterialTheme.colorScheme.surface,
    disabledContainerColor = MaterialTheme.colorScheme.onSurface,
)
val customCardElevation = CardDefaults.cardElevation(
    defaultElevation = 8.dp,
    pressedElevation = 2.dp,
    focusedElevation = 4.dp
)
Card(
    colors = customCardColors,
    elevation = customCardElevation
) {
    // m3 card content
}

می‌توانید درباره سفارشی‌سازی متریال ۳ بیشتر بخوانید.

رابط کاربری سیستم

برخی از جنبه‌های Material You از سبک بصری جدید و رابط کاربری سیستم در اندروید ۱۲ و بالاتر گرفته شده است. دو بخش کلیدی که در آن‌ها تغییراتی ایجاد شده است، موج‌دار شدن و پیمایش بیش از حد هستند. برای پیاده‌سازی این تغییرات نیازی به کار اضافی نیست.

موج دار شدن

Ripple اکنون از یک درخشش ظریف برای روشن کردن سطوح هنگام فشار دادن استفاده می‌کند. Compose Material Ripple از پلتفرم RippleDrawable در اندروید استفاده می‌کند، بنابراین sparkle ripple در اندروید ۱۲ و بالاتر برای همه کامپوننت‌های Material در دسترس است.

ریپل در M2 در مقابل M3
شکل ۱۷. ریپل در M2 در مقابل M3

پیمایش بیش از حد

Overscroll اکنون از یک اثر کششی در لبه‌ی محفظه‌های پیمایش استفاده می‌کند. Stretch Overscroll به طور پیش‌فرض در Composableهای محفظه پیمایش - برای مثال، LazyColumn ، LazyRow و LazyVerticalGrid - در Compose Foundation 1.1.0 و بالاتر، صرف نظر از سطح API، فعال است.

با استفاده از اثر کششی در لبه ظرف، بیش از حد اسکرول کنید
شکل ۱۸. اسکرول بیش از حد با استفاده از افکت کشیدگی در لبه‌ی ظرف

دسترسی‌پذیری

استانداردهای دسترسی‌پذیری که در کامپوننت‌های متریال تعبیه شده‌اند، به گونه‌ای طراحی شده‌اند که پایه و اساسی برای طراحی فراگیر محصول فراهم کنند. درک دسترسی‌پذیری محصول شما می‌تواند قابلیت استفاده را برای همه کاربران، از جمله افراد کم‌بینا، نابینا، دارای اختلالات شنوایی، دارای اختلالات شناختی، دارای اختلالات حرکتی یا دارای معلولیت‌های موقعیتی (مانند شکستگی بازو) افزایش دهد.

دسترسی به رنگ

رنگ پویا به گونه‌ای طراحی شده است که استانداردهای دسترسی‌پذیری برای کنتراست رنگ را برآورده کند. سیستم پالت‌های تُنال برای ایجاد هر طرح رنگی به صورت پیش‌فرض، بسیار مهم است.

سیستم رنگ Material مقادیر و اندازه‌گیری‌های استاندارد تُن را ارائه می‌دهد که می‌توانند برای دستیابی به نسبت‌های کنتراست قابل دسترس مورد استفاده قرار گیرند.

نمونه پاسخ اپلیکیشن: پالت‌های تُن اولیه، ثانویه و ثالثیه (از بالا به پایین)
شکل ۱۹. نمونه برنامه پاسخ: پالت‌های تُن اولیه، ثانویه و ثالثیه (از بالا به پایین)

تمام کامپوننت‌های متریال و قالب‌بندی پویا از قبل از نقش‌های رنگی فوق از مجموعه‌ای از پالت‌های تُنالیته استفاده می‌کنند که برای برآورده کردن الزامات دسترسی انتخاب شده‌اند. با این حال، اگر در حال سفارشی‌سازی کامپوننت‌ها هستید، حتماً از نقش‌های رنگی مناسب استفاده کنید و از عدم تطابق جلوگیری کنید.

از عبارت on-primary روی primary و از عبارت on-primary-container روی primary-container استفاده کنید، و همین کار را برای سایر رنگ‌های تأکیدی و خنثی نیز انجام دهید تا کنتراست قابل دسترسی برای کاربر فراهم شود.

استفاده از یک کانتینر سوم روی کانتینر اصلی، کنتراست ضعیفی را به کاربر ارائه می‌دهد:

// ✅ Button with sufficient contrast ratio
Button(
    onClick = { },
    colors = ButtonDefaults.buttonColors(
        containerColor = MaterialTheme.colorScheme.primary,
        contentColor = MaterialTheme.colorScheme.onPrimary
    )
) {
}

// ❌ Button with poor contrast ratio
Button(
    onClick = { },
    colors = ButtonDefaults.buttonColors(
        containerColor = MaterialTheme.colorScheme.tertiaryContainer,
        contentColor = MaterialTheme.colorScheme.primaryContainer
    )
) {
}

کنتراست کافی (چپ) در مقابل کنتراست ضعیف (راست)
شکل ۲۰. کنتراست کافی (چپ) در مقابل کنتراست ضعیف (راست)

دسترسی‌پذیری تایپوگرافی

مقیاس نوع M3، شیب و مقادیر نوع استاتیک را به‌روزرسانی می‌کند تا یک چارچوب ساده اما پویا از دسته‌بندی‌های اندازه ارائه دهد که در بین دستگاه‌ها مقیاس‌پذیر هستند.

برای مثال، در M3، می‌توان بسته به زمینه دستگاه، مانند تلفن یا تبلت، مقادیر مختلفی را به Display Small اختصاص داد.

صفحه نمایش‌های بزرگ

متریال، راهنمایی‌هایی در مورد طرح‌بندی‌های تطبیقی ​​و تاشو ارائه می‌دهد تا برنامه‌های شما را در دسترس قرار دهد و ارگونومی کاربرانی را که دستگاه‌های بزرگ را در دست دارند، بهبود بخشد.

متریال انواع مختلفی از ناوبری را ارائه می‌دهد تا به شما در ارائه تجربه کاربری بهتر برای دستگاه‌های بزرگ کمک کند.

می‌توانید درباره دستورالعمل‌های کیفیت برنامه‌های صفحه بزرگ اندروید بیشتر بدانید و برای طراحی تطبیقی ​​و دسترس‌پذیر، نمونه پاسخ ما را ببینید.

بیشتر بدانید

برای کسب اطلاعات بیشتر در مورد قالب‌بندی متریال در Compose، منابع زیر را بررسی کنید:

برنامه‌های نمونه

اسناد

مرجع API و کد منبع

ویدیوها

{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}