คุณสามารถกำหนดค่าคอนเทนเนอร์ตารางกริดเพื่อสร้างเลย์เอาต์ที่ยืดหยุ่นซึ่งตอบสนองต่อขนาดหน้าจอและประเภทเนื้อหาที่แตกต่างกัน หน้านี้อธิบายวิธีดำเนินการต่อไปนี้
- กำหนดตารางกริด: ตั้งค่าโครงสร้างพื้นฐานของแถวและคอลัมน์
- วางรายการในตารางกริด: ทำความเข้าใจวิธีวางรายการลงในเซลล์ตารางกริดและวิธีเปลี่ยนทิศทางการไหล
- จัดการการกำหนดขนาดแทร็ก: ใช้การกำหนดขนาดแบบคงที่ เปอร์เซ็นต์ ยืดหยุ่น และแบบภายในเพื่อกำหนดขนาดแทร็ก
- กำหนดช่องว่าง: จัดการ "ช่องว่าง" ระหว่างแถวและคอลัมน์
กำหนดตารางกริด
ตารางกริดประกอบด้วยคอลัมน์และแถว
Composable Grid มีพารามิเตอร์ config
ที่ยอมรับแลมบ์ดาเพื่อกำหนดคอลัมน์และแถว
ภายใน GridConfigurationScope
ตัวอย่างต่อไปนี้กำหนดตารางกริดที่มี 3 แถวและ 2 คอลัมน์
โดยแต่ละรายการมีขนาดคงที่ที่ระบุใน Dp
Grid( config = { repeat(2) { column(160.dp) } repeat(3) { row(90.dp) } } ) { }
วางรายการในตารางกริด
Grid จะนำองค์ประกอบ UI ในแลมบ์ดา content ไปวางไว้ในเซลล์ตารางกริด
ตารางกริดจะจัดวางรายการไม่ว่าคุณจะกำหนดแถวและคอลัมน์อย่างชัดเจนหรือไม่ก็ตาม
โดยค่าเริ่มต้น Grid จะพยายามวางองค์ประกอบ UI ในเซลล์ตารางกริดที่ว่างในแถวนั้น หากทำไม่ได้ ระบบจะวางองค์ประกอบ UI ในเซลล์ตารางกริดที่ว่างในแถวถัดไป
หากไม่มีเซลล์ว่าง Grid จะสร้างแถวใหม่
ในตัวอย่างต่อไปนี้ ตารางกริดมีเซลล์ตารางกริด 6 เซลล์และวางการ์ดลงในแต่ละเซลล์ (รูปที่ 1)
เซลล์ตารางกริดแต่ละเซลล์มีขนาด 160dp x 90dp ทำให้ขนาดตารางกริดทั้งหมดเป็น 320dp x 270dp
Grid( config = { repeat(2) { column(160.dp) } repeat(3) { row(90.dp) } } ) { Card1() Card2() Card3() Card4() Card5() Card6() }
หากต้องการเปลี่ยนลักษณะการทำงานเริ่มต้นนี้เป็นการเติมตามคอลัมน์,
ให้ตั้งค่าพร็อพเพอร์ตี้ flow เป็น GridFlow.Column
Grid( config = { repeat(2) { column(160.dp) } repeat(3) { row(90.dp) } gap(8.dp) flow = GridFlow.Column // Grid tries to place items to fill the column }, ) { Card1() Card2() Card3() Card4() Card5() Card6() }
GridFlow.Row (ซ้าย) และ GridFlow.Column (ขวา)
จัดการการกำหนดขนาดแทร็ก
แถวและคอลัมน์รวมกันเรียกว่าแทร็กตารางกริด คุณสามารถระบุขนาดของแทร็กตารางกริดได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
- คงที่ (
Dp): จัดสรรขนาดที่เฉพาะเจาะจง (เช่นcolumn(180.dp)) - เปอร์เซ็นต์ (
Float): จัดสรรเปอร์เซ็นต์ของพื้นที่ว่างทั้งหมดตั้งแต่0.0fถึง1.0f(เช่นrow(0.5f)สำหรับ 50%) - ยืดหยุ่น (
Fr): กระจายพื้นที่ที่เหลือตามสัดส่วนหลังจากคำนวณแทร็กแบบคงที่ และแบบเปอร์เซ็นต์แล้ว เช่น หากตั้งค่าแถว 2 แถวเป็น1.frและ3.frแถวหลังจะได้รับความสูงที่เหลือ 75% - ภายใน: กำหนดขนาดแทร็กตามเนื้อหาภายใน ดูข้อมูลเพิ่มเติมได้ที่ กำหนดขนาดแทร็กตารางกริดแบบภายใน
ตัวอย่างต่อไปนี้ใช้ตัวเลือกการกำหนดขนาดแทร็กต่างๆ เพื่อกำหนดความสูงของแถว
Grid( config = { column(1f) row(100.dp) row(0.2f) row(1.fr) row(GridTrackSize.Auto) }, modifier = Modifier.height(480.dp) ) { PastelRedCard("Fixed(100.dp)") PastelGreenCard("Percentage(0.2f)") PastelBlueCard("Flex(1.fr)") PastelYellowCard("Auto") }
Grid
กำหนดขนาดขั้นต่ำสำหรับแทร็กตารางกริดแบบยืดหยุ่น
เมื่อคอนเทนเนอร์ตารางกริดไม่มีพื้นที่เหลือ แทร็กแบบยืดหยุ่นมาตรฐานจะย่อลงเหลือ 0.dp ได้
หากต้องการป้องกันไม่ให้เกิดเหตุการณ์นี้และมั่นใจว่าเนื้อหาจะไม่ถูกบีบอัด
ให้ใช้ GridTrackSize.MinMax
เพื่อบังคับใช้ขนาดขั้นต่ำที่ชัดเจนในขณะที่ยังคงให้แทร็กมีความยืดหยุ่น
ตัวอย่างต่อไปนี้จัดสรรพื้นที่อย่างน้อย 100.dp ให้กับแถวแรก
Grid( config = { column(1f) // The first row has a minimum height of 100.dp and can expand to // the half of the remaining space. row(GridTrackSize.MinMax(100.dp, 1.fr)) // The second row takes the half of the remaining space. row(1.fr) // The third row has a fixed height of 200.dp. row(200.dp) }, modifier = Modifier.size(360.dp) // Total grid height is 360.dp ) { PastelRedCard("MinMax(100.dp, 1.fr)") PastelGreenCard("Flex(1.fr)") PastelBlueCard("Fixed(200.dp)") }
100.dp
กำหนดขนาดแทร็กตารางกริดขั้นต่ำเพื่อวางรายการแบบ Lazy
แทร็กแบบยืดหยุ่นมาตรฐานจะค้นหาขนาดภายในขององค์ประกอบย่อยโดยอัตโนมัติเพื่อกำหนดขนาดพื้นฐาน
อย่างไรก็ตาม Jetpack Compose ไม่อนุญาตให้ค้นหาขนาดภายในของ
SubcomposeLayout ซึ่งเป็นส่วนประกอบพื้นฐาน
เช่น LazyColumn และ LazyRow
การวางรายการแบบ Lazy ไว้ในแทร็กแบบยืดหยุ่นมาตรฐานจะทำให้เกิด
ข้อขัดข้อง IllegalStateException
หากต้องการวางรายการแบบ Lazy ไว้ในแทร็กตารางกริดแบบยืดหยุ่นอย่างปลอดภัย ให้ใช้ MinMax ที่มีขนาดขั้นต่ำที่ชัดเจน (เช่น 0.dp) เพื่อข้ามขั้นตอนการวัดภายใน
Grid( config = { column(1f) // The first row's height is determined by the height of the Text composable. row(GridTrackSize.Auto) // The second row occupies the remaining space, allowing the LazyColumn to scroll. row(GridTrackSize.MinMax(0.dp, 1.fr)) gap(8.dp) }, modifier = Modifier.size(width = 170.dp, height = 240.dp) ) { Text("Lazy column in a Grid") // The LazyColumn is placed in the second row, filling the remaining space. LazyColumn(verticalArrangement = Arrangement.spacedBy(4.dp)) { items(100) { number -> PastelGreenCard("Card $number") } } }
LazyColumn ในเซลล์ตารางกริด
กำหนดขนาดแทร็กตารางกริดแบบภายใน
คุณสามารถใช้ การกำหนดขนาดแบบภายใน สำหรับ Grid
เมื่อต้องการให้เลย์เอาต์ปรับให้เข้ากับเนื้อหา
แทนที่จะบังคับให้เนื้อหาอยู่ในคอนเทนเนอร์แบบคงที่
ขนาดแทร็กตารางกริดจะกำหนดโดยใช้ค่าต่อไปนี้
GridTrackSize.MaxContent: ใช้ขนาดภายในสูงสุดของเนื้อหา (เช่น ความกว้างจะกำหนดโดยความยาวเต็มของข้อความในบล็อกข้อความโดยไม่มีการตัดคำ)GridTrackSize.MinContent: ใช้ขนาดภายในต่ำสุดของเนื้อหา (เช่น ความกว้างจะกำหนดโดยคำเดียวที่ยาวที่สุดในบล็อกข้อความ)GridTrackSize.Auto: ใช้ขนาดที่ยืดหยุ่นสำหรับแทร็กที่ปรับตามพื้นที่ว่าง โดยค่าเริ่มต้นจะมีลักษณะการทำงานเหมือนMaxContentแต่จะย่อและตัดคำเนื้อหาให้พอดีกับคอนเทนเนอร์ระดับบนสุด
ตัวอย่างต่อไปนี้วางข้อความ 2 รายการไว้ข้างกัน ขนาดคอลัมน์สำหรับข้อความแรกจะกำหนดโดยความกว้างขั้นต่ำที่จำเป็นในการแสดงข้อความ และความกว้างของคอลัมน์ที่ 2 จะขึ้นอยู่กับความกว้างสูงสุดที่จำเป็นของข้อความ
Grid( config = { column(GridTrackSize.MinContent) column(GridTrackSize.MaxContent) row(1.0f) }, modifier = Modifier.width(480.dp) ) { Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet.") Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet.") }
กำหนดช่องว่างระหว่างแถวและคอลัมน์
เมื่อกำหนดขนาดแทร็กตารางกริดแล้ว
คุณสามารถแก้ไขช่องว่างของตารางกริดเพื่อปรับระยะห่างระหว่างแทร็กได้
คุณสามารถระบุช่องว่างของคอลัมน์ด้วยฟังก์ชัน columnGap
และช่องว่างของแถวด้วย rowGap ในตัวอย่างต่อไปนี้ มีช่องว่าง 16dp ระหว่างแต่ละแถว และช่องว่าง 8dp ระหว่างแต่ละคอลัมน์ (รูปที่ 5)
Grid( config = { repeat(2) { column(160.dp) } repeat(3) { row(90.dp) } rowGap(16.dp) columnGap(8.dp) } ) { Card1() Card2() Card3() Card4() Card5() Card6() }
นอกจากนี้ คุณยังใช้ฟังก์ชันอำนวยความสะดวก gap
เพื่อกำหนดช่องว่างที่มีขนาดคอลัมน์และแถวเท่ากัน
รวมถึงกำหนดขนาดคอลัมน์และช่องว่างแยกกันโดยใช้ฟังก์ชันเดียวได้ด้วย
โค้ดต่อไปนี้เพิ่มช่องว่าง 8dp ลงในตารางกริด
Grid( config = { repeat(2) { column(160.dp) } repeat(3) { row(90.dp) } gap(8.dp) // Equivalent to columnGap(8.dp) and rowGap(8.dp) } ) { Card1() Card2() Card3() Card4() Card5() Card6() }