แอปสื่อที่ทำงานบนทีวีต้องอนุญาตให้ผู้ใช้เรียกดูข้อเสนอเนื้อหา เลือก และเริ่มเล่นเนื้อหา ประสบการณ์การเรียกดูเนื้อหา สำหรับแอปประเภทนี้ควรใช้งานง่าย และดึงดูดสายตา รวมถึงน่าสนใจ
โดยปกติแล้วแคตตาล็อกเบราว์เซอร์จะประกอบด้วยหลายส่วน และแต่ละส่วน จะมีรายการเนื้อหาสื่อ ตัวอย่างส่วนในแคตตาล็อกสื่อ ได้แก่ เพลย์ลิสต์ เนื้อหาที่โดดเด่น หมวดหมู่แนะนำ
ใช้ฟังก์ชันที่ Compose สำหรับ TV มีให้เพื่อใช้สร้างอินเทอร์เฟซผู้ใช้สำหรับการเรียกดูเพลงหรือวิดีโอจากแคตาล็อกสื่อของแอป
สร้างฟังก์ชันที่ประกอบกันได้สำหรับแคตตาล็อก
ทุกอย่างที่ปรากฏบนจอแสดงผลจะได้รับการติดตั้งใช้งานเป็นฟังก์ชันที่ประกอบกันได้ใน Compose สำหรับ TV เริ่มต้นโดยการกำหนดฟังก์ชันที่ใช้ร่วมกันได้ สำหรับเบราว์เซอร์แคตตาล็อกสื่อ
@Composable fun CatalogBrowser( featuredContentList: List<Movie>, sectionList: List<Section>, modifier: Modifier = Modifier, onItemSelected: (Movie) -> Unit = {}, ) { // ToDo: add implementation }
CatalogBrowser คือฟังก์ชันที่ประกอบกันได้ซึ่งใช้แคตตาล็อกสื่อ
เบราว์เซอร์ ฟังก์ชันนี้ใช้อาร์กิวเมนต์ต่อไปนี้
- รายการเนื้อหาที่โดดเด่น
- รายการส่วน
- ออบเจ็กต์ตัวแก้ไข
- ฟังก์ชันเรียกกลับซึ่งทริกเกอร์การเปลี่ยนหน้าจอ
ตั้งค่าองค์ประกอบ UI
Compose สำหรับ TV มี Lazy List ซึ่งเป็นคอมโพเนนต์สำหรับแสดงรายการจำนวนมาก (หรือรายการที่มีความยาวที่ไม่รู้จัก) เรียกใช้
LazyColumn
เพื่อวางส่วนต่างๆ ในแนวตั้ง LazyColumn มีLazyListScope.() -> Unit
บล็อกซึ่งมี DSL สำหรับกำหนดเนื้อหารายการ ในตัวอย่างต่อไปนี้
แต่ละส่วนจะอยู่ในรายการแนวตั้งโดยมีช่องว่าง 16 dp ระหว่างส่วนต่างๆ
@Composable fun CatalogBrowser( featuredContentList: List<Movie>, sectionList: List<Section>, modifier: Modifier = Modifier, onItemSelected: (Movie) -> Unit = {}, ) { LazyColumn( modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.spacedBy(16.dp) ) { items(sectionList.size) { index -> val section = sectionList[index] SectionRow(section, onItemSelected = onItemSelected) } } }
ในตัวอย่างนี้ ฟังก์ชันที่ประกอบกันได้ SectionRow จะกำหนดวิธีแสดงส่วนต่างๆ
ในฟังก์ชันต่อไปนี้ LazyRow แสดงวิธีใช้ LazyColumn เวอร์ชันแนวนอนในลักษณะเดียวกันเพื่อกำหนดรายการแนวนอนด้วยบล็อก LazyListScope.() -> Unit โดยการเรียกใช้ DSL ที่ระบุ
@Composable fun SectionRow( section: Section, modifier: Modifier = Modifier, onItemSelected: (Movie) -> Unit = {}, ) { Text( text = section.title, style = MaterialTheme.typography.headlineSmall, ) MovieCatalog( section.movieList, onClick = { movie -> onItemSelected(movie) }, modifier ) }
@Composable fun MovieCatalog( movies: List<Movie>, onClick: (Movie) -> Unit, modifier: Modifier = Modifier, ) { LazyRow( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(8.dp) ) { items(movies.size) { index -> val movie = movies[index] MovieCard( movie = movie, onClick = { onClick(movie) } ) } } }
ในฟังก์ชันที่ประกอบกันได้ SectionRow จะใช้คอมโพเนนต์ Text
ข้อความและคอมโพเนนต์อื่นๆ
ที่กำหนดไว้ใน Material Design จะมีอยู่ในไลบรารี tv-material คุณเปลี่ยนรูปแบบข้อความตามที่กำหนดไว้ใน Material Design ได้โดยอ้างอิงออบเจ็กต์ MaterialTheme
ออบเจ็กต์นี้ยังมาจากไลบรารี tv-material ด้วย
Card เป็นส่วนหนึ่งของไลบรารี tv-material
MovieCard จะกำหนดวิธีแสดงข้อมูลภาพยนตร์แต่ละรายการในแคตตาล็อกที่กำหนด
เป็นข้อมูลโค้ดต่อไปนี้
@OptIn(ExperimentalMaterial3Api::class) @Composable fun MovieCard( movie: Movie, modifier: Modifier = Modifier, onClick: () -> Unit = {} ) { Card( modifier = modifier, onClick = onClick ) { AsyncImage( model = movie.thumbnailUrl, contentDescription = movie.title, ) } }
ไฮไลต์เนื้อหาที่โดดเด่น
ในตัวอย่างที่อธิบายไว้ก่อนหน้านี้ ภาพยนตร์ทั้งหมดจะแสดงอย่างเท่าเทียมกัน
โดยมีพื้นที่เท่ากันและไม่มีความแตกต่างกันในเชิงภาพ
คุณสามารถไฮไลต์บางส่วนด้วย Carousel
ภาพสไลด์จะแสดงข้อมูลในชุดรายการที่เลื่อน จาง หรือ เลื่อนเข้าสู่มุมมองได้ คุณใช้คอมโพเนนต์เพื่อไฮไลต์เนื้อหาที่โดดเด่น เช่น ภาพยนตร์ที่เพิ่งพร้อมให้รับชมหรือตอนใหม่ของรายการทีวี
Carousel
คาดหวังให้คุณระบุจำนวนรายการที่ภาพสไลด์มีและวิธีวาดแต่ละรายการเป็นอย่างน้อย คุณระบุรายการแรกได้ด้วย itemCount ส่วนตัวที่ 2
สามารถส่งเป็น Lambda ได้ ระบบจะส่งหมายเลขดัชนีของรายการที่แสดงไปยัง Lambda คุณสามารถกำหนดรายการที่แสดงได้โดยใช้
ค่าดัชนีที่ระบุ
@OptIn(ExperimentalTvMaterial3Api::class) @Composable fun FeaturedCarousel( featuredContentList: List<Movie>, modifier: Modifier = Modifier, ) { Carousel( itemCount = featuredContentList.size, modifier = modifier, ) { index -> val content = featuredContentList[index] Box { AsyncImage( model = content.backgroundImageUrl, contentDescription = content.description, placeholder = painterResource( id = R.drawable.movie_placeholder ), contentScale = ContentScale.Crop, modifier = Modifier.fillMaxSize() ) Text(text = content.title) } } }
Carousel อาจเป็นรายการของลิสต์แบบเลซี เช่น LazyColumn
ข้อมูลโค้ดต่อไปนี้แสดง FeaturedCarousel Composable ที่อยู่ด้านบนของ
Composable ทั้งหมดของ SectionRow
@OptIn(ExperimentalTvMaterial3Api::class) @Composable fun CatalogBrowser( featuredContentList: List<Movie>, sectionList: List<Section>, modifier: Modifier = Modifier, onItemSelected: (Movie) -> Unit = {}, ) { LazyColumn( modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.spacedBy(16.dp) ) { item { FeaturedCarousel(featuredContentList) } items(sectionList) { section -> SectionRow(section, onItemSelected = onItemSelected) } } }