با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
یک برنامه رسانه ای که روی تلویزیون اجرا می شود باید به کاربران اجازه دهد تا محتوای پیشنهادی آن را مرور کنند، انتخاب کنند و شروع به پخش محتوا کنند. تجربه مرور محتوا برای برنامه هایی از این نوع باید ساده، شهودی و از نظر بصری دلپذیر و جذاب باشد.
یک مرورگر کاتالوگ رسانه معمولا از چندین بخش تشکیل شده است و هر بخش دارای فهرستی از محتوای رسانه است. نمونههایی از بخشهای یک کاتالوگ رسانه عبارتند از: فهرستهای پخش، محتوای ویژه، دستههای پیشنهادی.
شکل 1. صفحه نمایش کاتالوگ معمولی. کاربران می توانند داده های کاتالوگ ویدیو را مرور کنند.
از عملکردهای ارائه شده توسط Compose for TV برای پیاده سازی یک رابط کاربری برای مرور موسیقی یا ویدیو از کاتالوگ رسانه برنامه خود استفاده کنید.
یک تابع قابل ترکیب برای کاتالوگ ایجاد کنید
هر چیزی که روی یک نمایشگر ظاهر می شود به عنوان یک تابع قابل ترکیب در Compose for TV پیاده سازی می شود. با تعریف یک تابع قابل ترکیب برای مرورگر کاتالوگ رسانه شروع کنید:
CatalogBrowser یک تابع قابل ترکیب است که مرورگر کاتالوگ رسانه شما را پیاده سازی می کند. تابع آرگومان های زیر را می گیرد:
فهرست مطالب برجسته
لیست بخش ها
یک شیء اصلاح کننده.
یک عملکرد برگشت به تماس، که باعث انتقال صفحه می شود.
تنظیم عناصر UI
نوشتن برای تلویزیون فهرستهای تنبل، مؤلفهای برای نمایش تعداد زیادی آیتم (یا فهرستی با طول نامعلوم) ارائه میدهد. برای قرار دادن بخش ها به صورت عمودی LazyColumn فراخوانی کنید. LazyColumn یک LazyListScope.() -> Unit block، که یک DSL را برای تعریف محتویات آیتم ارائه می دهد. در مثال زیر، هر بخش در یک لیست عمودی با فاصله 16 dp بین بخش ها قرار می گیرد:
در مثال، تابع Section composable نحوه نمایش بخش ها را تعریف می کند. در تابع زیر، LazyRow نشان می دهد که چگونه این نسخه افقی LazyColumn به طور مشابه برای تعریف یک لیست افقی با LazyListScope.() -> Unit با فراخوانی DSL ارائه شده:
در Section composable از کامپوننت Text استفاده شده است. متن و سایر اجزای تعریف شده در طراحی متریال در کتابخانه tv-material ارائه شده است. شما می توانید با مراجعه به شی MaterialTheme ، سبک متون را همانطور که در طراحی متریال تعریف شده است، تغییر دهید. این شی نیز توسط کتابخانه tv-material ارائه شده است. Card بخشی از کتابخانه مواد تلویزیونی است. MovieCard نحوه نمایش داده های هر فیلم را در کاتالوگ تعریف می کند که به صورت قطعه زیر تعریف شده است:
در مثالی که قبلا توضیح داده شد، همه فیلم ها به طور یکسان نمایش داده می شوند. آنها منطقه یکسانی دارند، هیچ تفاوت بصری بین آنها وجود ندارد. می توانید برخی از آنها را با Carousel برجسته کنید.
چرخ فلک اطلاعات را در مجموعهای از آیتمها نمایش میدهد که میتوانند لغزنده، محو شوند یا به نمای ظاهر شوند. از این مؤلفه برای برجسته کردن محتوای ویژه مانند فیلمهای تازه در دسترس یا قسمتهای جدید برنامههای تلویزیونی استفاده میکنید.
Carousel از شما انتظار دارد که حداقل تعداد آیتم هایی که Carousel دارد و نحوه ترسیم هر آیتم را مشخص کنید. اولین مورد را می توان با itemCount مشخص کرد. دومی را می توان به عنوان لامبدا رد کرد. شماره شاخص آیتم نمایش داده شده به لامبدا داده می شود. می توانید آیتم نمایش داده شده را با مقدار شاخص داده شده تعیین کنید:
Carousel می تواند موردی از یک لیست تنبل باشد، مانند TvLazyColumn . قطعه زیر FeaturedCarousel composable را در بالای همه Section composable نشان میدهد:
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-08-21 بهوقت ساعت هماهنگ جهانی.
[null,null,["تاریخ آخرین بهروزرسانی 2025-08-21 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Create a catalog browser\n\nA media app that runs on a TV needs to allow users to browse its content\nofferings, make a selection, and start playing content. The content browsing\nexperience for apps of this type should be simple, intuitive, and visually\npleasing and engaging.\n\nA media catalog browser tends to consist of several sections, and each section\nhas a list of media content. Examples of sections in a media catalog include:\nplaylists, featured content, recommended categories.\n**Figure 1.** Typical catalog screen. Users are able to browse video catalog data.\n\nUse the functions provided by Compose for TV to implement a user\ninterface for browsing music or videos from your app's media catalog.\n\nCreate a composable function for catalog\n----------------------------------------\n\nEverything appearing on a display is implemented as a composable function in\nCompose for TV. Start by defining a composable\nfunction for the media catalog browser: \n\n @Composable\n fun CatalogBrowser(\n featuredContentList: List\u003cMovie\u003e,\n sectionList: List\u003cSection\u003e,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n // ToDo: add implementation\n }\n\n`CatalogBrowser` is the composable function implementing your media catalog\nbrowser. The function takes the following arguments:\n\n- List of featured content.\n- List of sections.\n- A Modifier object.\n- A callback function, which triggers a screen transition.\n\nSet UI elements\n---------------\n\nCompose for TV offers lazy lists, a component to display a large\nnumber of items (or a list of an unknown length). Call\n[`LazyColumn`](/reference/kotlin/androidx/compose/foundation/lazy/package-summary#LazyColumn(androidx.compose.ui.Modifier,androidx.compose.foundation.lazy.LazyListState,androidx.compose.foundation.layout.PaddingValues,kotlin.Boolean,androidx.compose.foundation.layout.Arrangement.Vertical,androidx.compose.ui.Alignment.Horizontal,androidx.compose.foundation.gestures.FlingBehavior,kotlin.Boolean,kotlin.Function1))\nto place sections vertically. `LazyColumn` provides a\n[`LazyListScope.() -\u003e Unit`](/reference/kotlin/androidx/compose/foundation/lazy/LazyListScope)\nblock, which offers a DSL to define item contents. In the following example,\neach section is placed in a vertical list with a 16 dp gap between sections: \n\n @Composable\n fun CatalogBrowser(\n featuredContentList: List\u003cMovie\u003e,\n sectionList: List\u003cSection\u003e,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n LazyColumn(\n modifier = modifier.fillMaxSize(),\n verticalArrangement = Arrangement.spacedBy(16.dp)\n ) {\n items(sectionList) { section -\u003e\n Section(section, onItemSelected = onItemSelected)\n }\n }\n }\n\nIn the example, `Section` composable function defines how to display sections.\nIn the following function, [`LazyRow`](/reference/kotlin/androidx/compose/foundation/lazy/package-summary#LazyRow(androidx.compose.ui.Modifier,androidx.compose.foundation.lazy.LazyListState,androidx.compose.foundation.layout.PaddingValues,kotlin.Boolean,androidx.compose.foundation.layout.Arrangement.Horizontal,androidx.compose.ui.Alignment.Vertical,androidx.compose.foundation.gestures.FlingBehavior,kotlin.Boolean,kotlin.Function1)) demonstrates how this\nhorizontal version of [`LazyColumn`](/reference/kotlin/androidx/compose/foundation/lazy/package-summary#LazyColumn(androidx.compose.ui.Modifier,androidx.compose.foundation.lazy.LazyListState,androidx.compose.foundation.layout.PaddingValues,kotlin.Boolean,androidx.compose.foundation.layout.Arrangement.Vertical,androidx.compose.ui.Alignment.Horizontal,androidx.compose.foundation.gestures.FlingBehavior,kotlin.Boolean,kotlin.Function1)) is similarly used to\ndefine a horizontal list with a `LazyListScope.() -\u003e Unit` block by calling\nthe provided DSL: \n\n @Composable\n fun Section(\n section: Section,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n Text(\n text = section.title,\n style = MaterialTheme.typography.headlineSmall,\n )\n LazyRow(\n modifier = modifier,\n horizontalArrangement = Arrangement.spacedBy(8.dp)\n ) {\n items(section.movieList){ movie -\u003e\n MovieCard(\n movie = movie,\n onClick = { onItemSelected(movie) }\n )\n }\n }\n }\n\nIn the `Section` composable, the [`Text`](/reference/kotlin/androidx/tv/material3/package-summary#Text(androidx.compose.ui.text.AnnotatedString,androidx.compose.ui.Modifier,androidx.compose.ui.graphics.Color,androidx.compose.ui.unit.TextUnit,androidx.compose.ui.text.font.FontStyle,androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontFamily,androidx.compose.ui.unit.TextUnit,androidx.compose.ui.text.style.TextDecoration,androidx.compose.ui.text.style.TextAlign,androidx.compose.ui.unit.TextUnit,androidx.compose.ui.text.style.TextOverflow,kotlin.Boolean,kotlin.Int,kotlin.collections.Map,kotlin.Function1,androidx.compose.ui.text.TextStyle)) component is used.\nText and other components\ndefined in Material Design are offered in the tv-material library . You can\nchange the texts' style as defined in Material Design by referring to the\n[`MaterialTheme`](/reference/kotlin/androidx/tv/material3/MaterialTheme) object.\nThis object is also provided by the tv-material library.\n[`Card`](/reference/kotlin/androidx/tv/material3/package-summary#Card(kotlin.Function0,androidx.compose.ui.Modifier,androidx.tv.material3.CardShape,androidx.tv.material3.CardColors,androidx.tv.material3.CardScale,androidx.tv.material3.CardBorder,androidx.tv.material3.CardGlow,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.Function1)) is part of the tv-material library.\n`MovieCard` defines how each movie data is rendered in the catalog defined\nas the following snippet: \n\n @Composable\n fun MovieCard(\n movie: Movie,\n modifier: Modifier = Modifier,\n onClick: () -\u003e Unit = {}\n ) {\n Card(modifier = modifier, onClick = onClick){\n AsyncImage(\n model = movie.thumbnailUrl,\n contentDescription = movie.title,\n )\n }\n }\n\n| **Note:** `AsyncImage` is a composable that loads an image from the internet. See [Loading Images](/develop/ui/compose/graphics/images/loading#internet-loading) for details.\n\nHighlight featured content\n--------------------------\n\nIn the example described earlier, all movies are displayed equally.\nThey have the same area, no visual difference between them.\nYou can highlight some of them with [`Carousel`](/reference/kotlin/androidx/tv/material3/package-summary#Carousel(kotlin.Int,androidx.compose.ui.Modifier,androidx.tv.material3.CarouselState,kotlin.Long,androidx.compose.animation.ContentTransform,androidx.compose.animation.ContentTransform,kotlin.Function1,kotlin.Function2)).\n\nCarousel displays the information in a set of items that can slide, fade, or\nmove into view. You use the component to highlight featured content, such as\nnewly available movies or new episodes of TV programs.\n\n[`Carousel`](/reference/kotlin/androidx/tv/material3/package-summary#Carousel(kotlin.Int,androidx.compose.ui.Modifier,androidx.tv.material3.CarouselState,kotlin.Long,androidx.compose.animation.ContentTransform,androidx.compose.animation.ContentTransform,kotlin.Function1,kotlin.Function2))\nexpects you to at least specify the number of items that Carousel has and how to\ndraw each item. The first one can be specified with `itemCount`. The second one\ncan be passed as a lambda. The index number of the displayed item is\ngiven to the lambda. You can determine the displayed item with the\ngiven index value: \n\n @Composable\n function FeaturedCarousel(\n featuredContentList: List\u003cMovie\u003e,\n modifier: Modifier = Modifier,\n ) {\n Carousel(\n itemCount = featuredContentList.size,\n modifier = modifier,\n ) { index -\u003e\n val content = featuredContentList[index]\n Box {\n AsyncImage(\n model = content.backgroundImageUrl,\n contentDescription = content.description,\n placeholder = painterResource(\n id = R.drawable.placeholder\n ),\n contentScale = ContentScale.Crop,\n modifier = Modifier.fillMaxSize()\n )\n Text(text = content.title)\n }\n }\n }\n\n`Carousel` can be an item of a lazy list, such as `TvLazyColumn`.\nThe following snippet shows `FeaturedCarousel` composable on top of the\nall `Section` composables: \n\n @Composable\n fun CatalogBrowser(\n featuredContentList: List\u003cMovie\u003e,\n sectionList: List\u003cSection\u003e,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n TvLazyColumn(\n modifier = modifier.fillMaxSize(),\n verticalArrangement = Arrangement.spacedBy(16.dp)\n ) {\n\n item {\n FeaturedCarousel(featuredContentList)\n }\n\n items(sectionList) { section -\u003e\n Section(section, onItemSelected = onItemSelected)\n }\n }\n }"]]