پیش‌نمایش کردن واسط کاربر با پیش‌نمایش‌های ترکیب‌شدنی

ترکیب‌پذیر با تابع تعریف می‌شود و با @Composable حاشیه‌نویسی می‌شود:

@Composable
fun SimpleComposable() {
    Text("Hello World")
}

عنصر نوشتاری ساده‌ای که حاوی کلمات «Hello
World» است

برای فعال کردن پیش‌نمایش این عنصر ترکیبی، عنصر ترکیبی دیگری بسازید که با @Composable و @Preview حاشیه‌نویسی شده باشد. این عنصر ترکیبی جدید حاشیه‌نویسی‌شده اکنون حاوی عنصر ترکیبی‌ای است که در ابتدا ایجاد کردید، SimpleComposable:

@Preview
@Composable
fun SimpleComposablePreview() {
    SimpleComposable()
}

گزارمان @Preview به Android Studio می‌گوید که این ترکیب‌پذیر باید در نمای طراحی این فایل نشان داده شود. می‌توانید به‌روزرسانی‌های زنده پیش‌نمایش ترکیبی را هنگام انجام ویرایش‌ها ببینید.

گیفی که به‌روزرسانی‌های هم‌زمان را بااستفاده از «پیش‌نویس» نشان می‌دهد
پیش‌نمایش

می‌توانید پارامترها را به‌صورت دستی در کدتان اضافه کنید تا روشی را که Android Studio @Preview را پرداز می‌کند سفارشی‌سازی کنید. حتی می‌توانید چندین بار حاشیه‌نویسی @Preview را به همان تابع اضافه کنید تا یک عنصر ترکیبی را با ویژگی‌های مختلف پیش‌دید کنید.

یکی از مزایای اصلی استفاده از عناصر ترکیبی @Preview اجتناب از اتکا به شبیه‌ساز در «استودیو Android» است. می‌توانید راه‌اندازی سنگین حافظه شبیه‌ساز را برای تغییرات نهایی ظاهر و احساس ذخیره کنید، و از توانایی @Preview برای ایجاد و آزمایش تغییرات کوچک کد به‌راحتی استفاده کنید.

برای استفاده مؤثر از گل‌نویسی @Preview، حتماً صفحه‌هایتان را براساس وضعیتی که به‌عنوان ورودی دریافت می‌کند و رویدادهایی که به‌عنوان برونداد ارائه می‌دهد تعریف کنید.

‫@Preview خود را تعریف کنید

‫Android Studio ویژگی‌هایی برای گسترش پیش‌نمایش‌های ترکیب‌پذیر ارائه می‌دهد. می‌توانید طراحی محتوی آن‌ها را تغییر دهید، با آن‌ها تعامل داشته باشید، یا آن‌ها را مستقیماً در شبیه‌ساز یا دستگاه پیاده کنید.

ابعاد

به‌طور پیش‌فرض، @Preview بُعد به‌طور خودکار برای پیچیدن محتوای آن انتخاب می‌شود. برای تنظیم دستی ابعاد، پارامترهای heightDp و widthDp را اضافه کنید. این مقادیر قبلاً به‌عنوان dp تفسیر شده‌اند، بنابراین نیازی نیست .dp را به آن‌ها اضافه کنید:

@Preview(widthDp = 50, heightDp = 50)
@Composable
fun SquareComposablePreview() {
    Box(Modifier.background(Color.Yellow)) {
        Text("Hello World")
    }
}

مربعی زرد با کلمات «Hello
World»

پیش‌نمایش رنگ پویا

اگر رنگ پویا را در برنامه‌تان فعال کرده‌اید، از ویژگی wallpaper برای عوض کردن تصویر زمینه‌ها استفاده کنید و ببینید میانای کاربری شما چگونه به تصویر زمینه انتخابی کاربران مختلف واکنش نشان می‌دهد. از بین زمینه‌های مختلف کاغذدیواری ارائه‌شده توسط Wallpaper کلاس انتخاب کنید. این ویژگی به Compose نسخه ۱.۴.۰ یا بالاتر نیاز دارد.

استفاده با دستگاه‌های مختلف

در Android Studio Flamingo، می‌توانید پارامتر device حاشیه‌نویسی «پیش‌نمایش» را ویرایش کنید تا پیکربندی‌های عناصر ترکیبی را در دستگاه‌های مختلف تعریف کنید.

نمونه تابع
ترکیبی

وقتی پارامتر دستگاه رشته خالی (@Preview(device = "")) دارد، می‌توانید با فشار دادن Ctrl + Space، تکمیل خودکار را فراخوانی کنید. سپس می‌توانید مقادیر هر پارامتر را تنظیم کنید.

درحال ویرایش تابع نمونه

از تکمیل خودکار، می‌توانید هر گزینه دستگاهی را از فهرست انتخاب کنید–برای مثال، @Preview(device = "id:pixel_4"). یا می‌توانید با انتخاب spec:width=px,height=px,dpi=int…، دستگاه سفارشی وارد کنید تا مقادیر هر پارامتر را به‌صورت جداگانه تنظیم کنید.

فهرست مشخصات

برای اعمال کردن، Enter را فشار دهید، یا با Esc لغو کنید.

اگر مقدار نامعتبر تنظیم کنید، زیر اظهارنامه خط قرمز کشیده می‌شود و ممکن است اصلاحی دردسترس باشد (Alt + Enter (⌥ + ⏎ برای macOS) > جایگزین کردن با …. «بازرسی» تلاش می‌کند اصلاحی ارائه دهد که بیشترین شباهت را به ورودی شما داشته باشد.

مثال مقدار نامعتبر

منطقه زبانی

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

@Preview(locale = "fr-rFR")
@Composable
fun DifferentLocaleComposablePreview() {
    Text(text = stringResource(R.string.greeting))
}

عنصر نوشتاری ساده‌ای که حاوی کلمه «Bonjour» با پرچم فرانسه است

تنظیم رنگ پس‌زمینه

به‌طور پیش‌فرض، عنصر ترکیبی شما با پس‌زمینه شفاف نمایش داده می‌شود. برای افزودن پس‌زمینه، پارامترهای showBackground و backgroundColor را اضافه کنید. به‌خاطر داشته باشید که backgroundColor یک ARGB Long است، نه یک مقدار Color

@Preview(showBackground = true, backgroundColor = 0xFF00FF00)
@Composable
fun WithGreenBackground() {
    Text("Hello World")
}

مستطیل سبزرنگی با نوشتار «Hello
World»

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

اگر نیاز دارید نوار وضعیت و نوار کنش را در پیش‌نمایش نمایش دهید، پارامتر showSystemUi را اضافه کنید:

@Preview(showSystemUi = true)
@Composable
fun DecoratedComposablePreview() {
    Text("Hello World")
}

پنجره پیش‌نمایشی که فعالیتی را با وضعیت و نوارهای کنش نشان می‌دهد.

حالت میانای کاربر

پارامتر uiMode می‌تواند هریک از Configuration.UI_* ثابت‌ها را بگیرد و به شما امکان می‌دهد رفتار پیش‌نمایش را متناسب با آن تغییر دهید. برای مثال، می‌توانید پیش‌نمایش را روی «حالت شب» تنظیم کنید تا ببینید زمینه چگونه واکنش نشان می‌دهد.

میانای کاربر پیش‌نمای Compose

LocalInspectionMode

می‌توانید از LocalInspectionMode CompositionLocal بخوانید تا ببینید آیا عنصر ترکیبی در پیش‌نمایش (درون عنصر بازرسی‌پذیر) پرداز می‌شود یا نه. اگر قطعه در پیش‌نمایش پردازنده شود، LocalInspectionMode.current به true ارزیابی می‌شود. این اطلاعات به شما امکان می‌دهد پیش‌نمای خود را سفارشی‌سازی کنید؛ برای مثال، می‌توانید به‌جای نمایش داده‌های واقعی، یک تصویر جای‌بان در پنجره پیش‌نمایش نشان دهید.

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

@Composable
fun GreetingScreen(name: String) {
    if (LocalInspectionMode.current) {
        // Show this text in a preview window:
        Text("Hello preview user!")
    } else {
        // Show this text in the app:
        Text("Hello $name!")
    }
}

تعامل با @Preview

«استودیو Android» ویژگی‌هایی ارائه می‌دهد که به شما امکان می‌دهد با پیش‌نمایش‌های تعریف‌شده‌تان تعامل داشته باشید. این تعامل به شما کمک می‌کند رفتار زمان اجرای پیش‌نمایش‌هایتان را درک کنید و به شما امکان می‌دهد با پیش‌نمایش‌ها بهتر در واسط کاربر ناوبری کنید.

حالت تعاملی

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

کاربری که روی دکمه «تعاملی»
پیش‌نمایش کلیک می‌کند

ویدیویی از کاربر درحال تعامل با
پیش‌نمایش

پیمایش کد و نمای کلی ترکیب‌کردنی

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

کاربر موشواره را روی پیش‌نمایش نگه می‌دارد و باعث می‌شود «استودیو» خطوط کلی
ترکیب‌پذیرهای
آن را نمایش دهد

اجرای پیش‌نمایش

می‌توانید @Preview خاصی را در شبیه‌ساز یا دستگاه فیزیکی اجرا کنید. پیش‌نمایش در همان برنامه پروژه به‌عنوان Activity جدیدی پیاده‌سازی می‌شود، بنابراین از زمینه و اجازه‌های یکسانی استفاده می‌کند. اگر قبلاً اجازه داده شده باشد، نیازی نیست کد کلیشه‌ای درخواست اجازه را بنویسید.

روی نماد اجرای پیش‌نمایش اجرای پیش‌نمایش
نماد در کنار @Preview گزارمان یا در بالای پیش‌نمایش کلیک کنید، و Android Studio آن @Preview را در دستگاه متصل یا شبیه‌ساز شما مستقر می‌کند.

کاربری که روی پیش‌نمایش کلیک می‌کند

ویدیو کاربر درحال استقرار پیش‌نمایش در دستگاه

کپی کردن @Preview پردازنده

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

کاربری که روی پیش‌نمایش کلیک می‌کند تا آن را به‌عنوان تصویر کپی کند.

چندین پیش‌نمایش از همان گزارمان @Preview

می‌توانید چندین نسخه از همان @Preview قابل ترکیب را با مشخصات مختلف یا پارامترهای مختلفی که به قابل ترکیب ارسال شده است نمایش دهید. به‌این‌ترتیب، می‌توانید کد کلیشه‌ای را که درغیراین‌صورت باید می‌نوشتید کاهش دهید.

الگوهای پیش‌نمایش چندگانه

‫androidx.compose.ui:ui-tooling-preview نسخه 1.6.0-alpha01+ الگوهای API «پیش‌نمایش چندگانه» را معرفی می‌کند: الگوهای API: @PreviewScreenSizes،‏ @PreviewFontScales،‏ @PreviewLightDark، و @PreviewDynamicColors، تا با یک گزارمان واحد بتوانید «واسط کاربر Compose» خود را در سناریوهای رایج پیش‌نمایش کنید.

پیش‌نمایش قلم‌های مختلف و اندازه‌های صفحه بااستفاده از الگوها

ساختن گزارمان‌های چندپیش‌نمایش سفارشی

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

با ایجاد کلاس شرح سفارشی خودتان شروع کنید:

@Preview(
    name = "small font",
    group = "font scales",
    fontScale = 0.5f
)
@Preview(
    name = "large font",
    group = "font scales",
    fontScale = 1.5f
)
annotation class FontScalePreviews

می‌توانید از این حاشیه‌نویسی سفارشی برای عناصر ترکیبی پیش‌نمایش استفاده کنید:

@FontScalePreviews
@Composable
fun HelloWorldPreview() {
    Text("Hello World")
}

برگه طراحی «استودیو Android» که عنصر ترکیبی را با قلم کوچک و بزرگ نشان می‌دهد

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

@Preview(
    name = "Spanish",
    group = "locale",
    locale = "es"
)
@FontScalePreviews
annotation class CombinedPreviews

@CombinedPreviews
@Composable
fun HelloWorldPreview2() {
    MaterialTheme { Surface { Text(stringResource(R.string.hello_world)) } }
}

زبانه طراحی «استودیو Android» که عنصر ترکیبی را در همه پیکربندی‌ها نشان می‌دهد

ماهیت ترکیب و تطبیق پیش‌نمایش چندگانه-- و پیش‌نمایش معمولی!-- به شما امکان می‌دهد بسیاری از ویژگی‌های پروژه‌های بزرگ‌تر را به‌طور جامع‌تر آزمایش کنید.

‫@Preview و مجموعه‌های بزرگ داده

اغلب، نیاز پیش می‌آید که مجموعه داده بزرگی را به پیش‌نمایش ترکیب‌پذیرتان منتقل کنید. برای انجام این کار، کافی است با افزودن پارامتری با حاشیه‌نویسی @PreviewParameter ، داده‌های نمونه را به تابع «پیش‌نمایش ترکیبی» ارسال کنید.

@Preview
@Composable
fun UserProfilePreview(
    @PreviewParameter(UserPreviewParameterProvider::class) user: User
) {
    UserProfile(user)
}

برای ارائه داده‌های نمونه، کلاسی ایجاد کنید که PreviewParameterProvider را پیاده‌سازی کند و داده‌های نمونه را به‌صورت توالی برگرداند.

class UserPreviewParameterProvider : PreviewParameterProvider<User> {
    override val values = sequenceOf(
        User("Elise"),
        User("Frank"),
        User("Julia")
    )
}

این کار یک پیش‌نمایش برای هر عنصر داده در توالی ارائه می‌دهد:

پیش‌نمایش‌هایی که عناصر ترکیبی Elise،‏ Frank، و Julia را نشان می‌دهد

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

@Preview
@Composable
fun UserProfilePreview2(
    @PreviewParameter(UserPreviewParameterProvider::class, limit = 2) user: User
) {
    UserProfile(user)
}

پیش‌نمایش‌هایی که از @PreviewParameter استفاده می‌کنند به‌طور پیش‌فرض بااستفاده از شاخص پارامتر و نام دارایی (کاربر ۰، کاربر ۱، کاربر ۲، و غیره) نام‌گذاری می‌شوند که می‌تواند تشخیص آن‌ها از یکدیگر را دشوار کند. برای بهبود وضوح پیش‌نمایش، می‌توانید با ملغی کردن getDisplayName() در PreviewParameterProvider، نام‌های نمایش سفارشی برای هر پیش‌نمایش ارائه دهید. این کار به تمایز بین تغییرات مختلف داده‌ها یا حالت‌های میانای کاربر کمک می‌کند. برای مثال، می‌توانید پیش‌نمایش‌ها را براساس داده‌های ورودی برچسب‌گذاری کنید:

class UserAgePreviewParameterProvider : PreviewParameterProvider<User> {
    // Using a List internally for efficient index-based access
    private val userList = listOf(
        User(name = "Elise", age = 30),
        User(name = "Frank", age = 31),
        User(name = "Julia", age = 40)
    )

    override val values = userList.asSequence()

    override fun getDisplayName(index: Int): String? {
        // Return null or an empty string to use the default index-based name
        val user = userList.getOrNull(index) ?: return null
        return "${user.name} - ${user.age}"
    }
}

پیش‌نمایش‌هایی با نام‌های نمایشی سفارشی که Elise - 30،‏ Frank - 31، و Julia - 40 عناصر ترکیبی را نشان می‌دهد

تولید پیش‌نمایش با کمک هوش مصنوعی

عامل هوش مصنوعی در «استودیو Android» می‌تواند پیش‌نمایش‌های Compose را به‌طور خودکار برای ترکیب‌پذیرهایتان تولید کند. روی یک تابع «ترکیب‌شدنی» کلیک راست کنید و هوش مصنوعی > تولید پیش‌نمایش برای [نام «ترکیب‌شدنی»] را انتخاب کنید. نماینده با تجزیه‌وتحلیل عنصر ترکیبی شما، @Preview کلیشه ضروری را با پارامترهای صحیح تولید می‌کند و به شما کمک می‌کند به‌سرعت تأیید کنید که رابط کاربری شما همان‌طور که انتظار می‌رود پرداز می‌شود.

بااستفاده از هوش مصنوعی، «پیش‌نمایش نوشتن» تولید کنید.

کلاس گزارمان @Preview

همیشه می‌توانید در Android Studio با «ctrl یا ⌘ + کلیک» روی @Preview گزارمان، فهرست کاملی از پارامترهایی که هنگام سفارشی‌سازی پیش‌نمایش قابل‌تنظیم هستند را ببینید.

annotation class Preview(
    val name: String = "",
    val group: String = "",
    @IntRange(from = 1) val apiLevel: Int = -1,
    val widthDp: Int = -1,
    val heightDp: Int = -1,
    val locale: String = "",
    @FloatRange(from = 0.01) val fontScale: Float = 1f,
    val showSystemUi: Boolean = false,
    val showBackground: Boolean = false,
    val backgroundColor: Long = 0,
    @UiMode val uiMode: Int = 0,
    @Device val device: String = Devices.DEFAULT,
    @Wallpaper val wallpaper: Int = Wallpapers.NONE,
)

محدودیت‌ها و روال‌های مطلوب

‫Android Studio کد پیش‌نمایش را مستقیماً در ناحیه پیش‌نمایش اجرا می‌کند. این کار به اجرای شبیه‌ساز یا دستگاه فیزیکی نیاز ندارد زیرا از بخش انتقال‌یافته چارچوب Android به‌نام Layoutlib استفاده می‌کند. ‫Layoutlib نسخه سفارشی چارچوب Android است که برای اجرا در خارج از دستگاه‌های Android طراحی شده است. هدف کتابخانه این است که پیش‌نمایی از چیدمان در Android Studio ارائه دهد که بسیار نزدیک به پرداز آن در دستگاه‌ها است.

محدودیت‌های پیش‌نمایش

به‌دلیل نحوه پرداز پیش‌نمایش‌ها در Android Studio، این پیش‌نمایش‌ها سبک هستند و برای پرداز کردن آن‌ها به کل چارچوب Android نیاز نیست. بااین‌حال، این کار محدودیت‌های زیر را به‌همراه دارد:

  • دسترسی به شبکه وجود ندارد
  • بدون دسترسی به فایل
  • برخی‌از APIهای Context ممکن است به‌طور کامل دردسترس نباشند

پیش‌نمایش‌ها و ViewModels

وقتی از ViewModel در یک ترکیب‌پذیر استفاده می‌کنید، پیش‌نمایش‌ها محدود است. سیستم پیش‌نمایش نمی‌تواند همه پارامترهای ارسال‌شده به ViewModel را، مثل مخزن‌ها، موارد استفاده، مدیران، یا موارد مشابه، بسازد. همچنین، اگر ViewModel شما در تزریق وابستگی شرکت می‌کند (مثلاً با Hilt)، سیستم پیش‌نمایش نمی‌تواند کل گراف وابستگی را برای ساختن ViewModel بسازد.

وقتی سعی می‌کنید یک عنصر ترکیبی را با ViewModel پیش‌نمایش کنید، Android Studio هنگام پرداز کردن عنصر ترکیبی خاص، خطایی نشان می‌دهد:

بخش مشکل «استودیو Android» با پیام «ViewModel نمونه‌سازی نشد»

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

@Composable
fun AuthorScreen(viewModel: AuthorViewModel = viewModel()) {
  AuthorScreen(
    name = viewModel.authorName,
    // ViewModel sends the network requests and makes posts available as a state
    posts = viewModel.posts
  )
}

@Composable
fun AuthorScreen(
  name: NameLabel,
  posts: PostsList
) {
  // ...
}

@Preview
@Composable
fun AuthorScreenPreview(
  // You can use some sample data to preview your composable without the need to construct the ViewModel
  name: String = sampleAuthor.name,
  posts: List<Post> = samplePosts[sampleAuthor]
) {
  AuthorScreen(
      name = NameLabel(name),
      posts = PostsList(posts)
  )
}

منابع بیشتر

  • برای خواندن بیشتر درباره اینکه Android Studio چگونه @Preview سهولت استفاده را ترویج می‌دهد و با نکته‌های ابزارسازی بیشتر آشنا شوید، وبلاگ ابزارسازی Compose را بررسی کنید.
  • برای راهنمای قدیمی «نماها»، به توسعه چیدمان با «نماها» مراجعه کنید.