สร้างเบราว์เซอร์แคตตาล็อก

แอปสื่อที่ทำงานบนทีวีต้องอนุญาตให้ผู้ใช้เรียกดูข้อเสนอเนื้อหา เลือก และเริ่มเล่นเนื้อหา ประสบการณ์การเรียกดูเนื้อหา สำหรับแอปประเภทนี้ควรใช้งานง่าย และดึงดูดสายตา รวมถึงน่าสนใจ

โดยปกติแล้วแคตตาล็อกเบราว์เซอร์จะประกอบด้วยหลายส่วน และแต่ละส่วน จะมีรายการเนื้อหาสื่อ ตัวอย่างส่วนในแคตตาล็อกสื่อ ได้แก่ เพลย์ลิสต์ เนื้อหาที่โดดเด่น หมวดหมู่แนะนำ

รูปที่ 1 หน้าจอแคตตาล็อกทั่วไป ผู้ใช้จะเรียกดูข้อมูลแคตตาล็อกวิดีโอได้

ใช้ฟังก์ชันที่ 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 คุณสามารถกำหนดรายการที่แสดงได้โดยใช้ ค่าดัชนีที่ระบุ

Carousel อาจเป็นรายการของลิสต์แบบเลซี เช่น LazyColumn ข้อมูลโค้ดต่อไปนี้แสดง FeaturedCarousel Composable ที่อยู่ด้านบนของ Composable ทั้งหมดของ SectionRow