คุณใช้รูปแบบได้ 3 วิธีทั่วทั้งแอป ดังนี้
- ใช้โดยตรงกับคอมโพเนนต์ที่มีอยู่ซึ่งแสดงพารามิเตอร์
Style - ใช้รูปแบบด้วย
Modifier.styleableในเลย์เอาต์ Composables ที่ไม่ยอมรับพารามิเตอร์Style - ในระบบการออกแบบที่กำหนดเอง ให้ใช้
Modifier.styleable{}และแสดงพารามิเตอร์สไตล์ในคอมโพเนนต์ของคุณเอง
พร็อพเพอร์ตี้ที่ใช้ได้ในสไตล์
สไตล์รองรับพร็อพเพอร์ตี้หลายรายการเหมือนกับที่ตัวแก้ไขรองรับ แต่ไม่ใช่ทุกอย่างที่เป็นตัวแก้ไขจะทำซ้ำได้ด้วยสไตล์ คุณยังคงต้องใช้ ตัวแก้ไขสำหรับลักษณะการทำงานบางอย่าง เช่น การโต้ตอบ การวาดที่กำหนดเอง หรือการซ้อน พร็อพเพอร์ตี้
| การจัดกลุ่ม | คุณสมบัติ | รับช่วงต่อโดยบุตรหลาน |
|---|---|---|
| เลย์เอาต์และการปรับขนาด | ||
| Padding | contentPadding (ด้านใน) และ externalPadding (ด้านนอก) มีให้เลือกในรูปแบบทิศทาง แนวนอน แนวตั้ง และทุกด้าน |
ไม่ |
| ขนาด | fillWidth/Height/Size() และ width, height และ size (รองรับเศษส่วน Dp, DpSize หรือ Float) |
ไม่ |
| การอธิบายหัวข้อต่างๆ แก่ลูกค้า | left/top/right/bottom ออฟเซ็ต |
ไม่ |
| ลักษณะที่ปรากฏ | ||
| เติม | background และ foreground (รองรับ Color หรือ Brush) |
ไม่ |
| เส้นขอบ | borderWidth, borderColor และ borderBrush |
ไม่ |
| รูปทรง | shape |
ไม่ได้ แต่ใช้ร่วมกับพร็อพเพอร์ตี้อื่นๆ clip และ border ใช้รูปร่างที่กำหนดนี้ |
| แสงเงา | dropShadow, innerShadow |
ไม่ |
| การเปลี่ยนรูปแบบ | ||
| การเคลื่อนไหวเชิงพื้นที่ของเลเยอร์กราฟิก | translationX, translationY, scaleX/Y, rotationX/Y/Z |
ไม่ |
| ควบคุม | alpha, zIndex (ลำดับการซ้อน) และ transformOrigin (จุดหมุน) |
ไม่ |
| การจัดตัวอักษร | ||
| การจัดรูปแบบ | textStyle, fontSize, fontWeight, fontStyle และ fontFamily |
ใช่ |
| การใช้สี | contentColor และcontentBrush นอกจากนี้ยังใช้สำหรับการจัดรูปแบบไอคอนด้วย |
ใช่ |
| ย่อหน้า | lineHeight, letterSpacing, textAlign, textDirection, lineBreak และ hyphens |
ใช่ |
| การตกแต่ง | textDecoration, textIndent และ baselineShift |
ใช่ |
ใช้รูปแบบกับคอมโพเนนต์โดยตรงด้วยพารามิเตอร์รูปแบบ
คอมโพเนนต์ที่แสดงพารามิเตอร์ Style ช่วยให้คุณกำหนดรูปแบบของคอมโพเนนต์ได้ดังนี้
BaseButton( onClick = { }, style = { } ) { BaseText("Click me") }
ภายใน Lambda ของสไตล์ คุณสามารถตั้งค่าพร็อพเพอร์ตี้ต่างๆ เช่น externalPadding
หรือ background ได้
BaseButton( onClick = { }, style = { background(Color.Blue) } ) { BaseText("Click me") }
ดูรายการพร็อพเพอร์ตี้ที่รองรับทั้งหมดได้ที่พร็อพเพอร์ตี้ที่ใช้ได้ใน สไตล์
ใช้รูปแบบโดยใช้ตัวแก้ไขสำหรับคอมโพเนนต์ที่ไม่มีพารามิเตอร์ที่มีอยู่
สำหรับคอมโพเนนต์ที่ไม่มีพารามิเตอร์รูปแบบในตัว คุณยังคงใช้รูปแบบได้
ด้วยตัวแก้ไข styleable นอกจากนี้ วิธีนี้ยังมีประโยชน์เมื่อพัฒนาคอมโพเนนต์ที่กำหนดเองของคุณเองด้วย
Row( modifier = Modifier.styleable { } ) { BaseText("Content") }
คุณสามารถใส่พร็อพเพอร์ตี้ เช่น background หรือ padding ภายใน Lambda ได้เช่นเดียวกับพารามิเตอร์ style
Row( modifier = Modifier.styleable { background(Color.Blue) } ) { BaseText("Content") }
ตัวแก้ไข Modifier.styleable ที่เชื่อมโยงหลายรายการจะเพิ่มคุณสมบัติที่ไม่ได้รับค่ามา
ให้กับคอมโพสเซเบิลที่ใช้ โดยจะทำงานคล้ายกับตัวแก้ไขหลายรายการ
ที่กำหนดคุณสมบัติเดียวกัน สำหรับพร็อพเพอร์ตี้ที่รับช่วงมา ระบบจะลบล้างพร็อพเพอร์ตี้เหล่านี้
และตัวแก้ไข styleable ตัวสุดท้ายในเชนจะตั้งค่า
เมื่อใช้ Modifier.styleable คุณอาจต้องสร้างและระบุ StyleState เพื่อใช้กับตัวแก้ไขเพื่อใช้การจัดรูปแบบตามสถานะ ดูรายละเอียดเพิ่มเติมได้ที่สถานะและภาพเคลื่อนไหวที่มี
สไตล์
กำหนดรูปแบบแบบสแตนด์อโลน
คุณกำหนดสไตล์แบบสแตนด์อโลนเพื่อนำกลับมาใช้ใหม่ได้โดยทำดังนี้
val style = Style { background(Color.Blue) }
จากนั้นคุณจะส่งสไตล์ที่กำหนดนั้นไปยังพารามิเตอร์สไตล์ของ Composable หรือใช้
Modifier.styleableได้ เมื่อใช้ Modifier.styleable คุณต้องสร้างออบเจ็กต์
StyleState ด้วย StyleState มีการอธิบายรายละเอียดไว้ในเอกสารประกอบสถานะและภาพเคลื่อนไหวที่มีสไตล์
ตัวอย่างต่อไปนี้แสดงวิธีใช้สไตล์โดยตรงผ่านพารามิเตอร์ในตัวของคอมโพเนนต์ หรือผ่าน Modifier.styleable
val style = Style { background(Color.Blue) } // built in parameter BaseButton(onClick = { }, style = style) { BaseText("Button") } // modifier styleable val styleState = remember { MutableStyleState(null) } Column( Modifier.styleable(styleState, style) ) { BaseText("Column content") }
นอกจากนี้ คุณยังส่งสไตล์นั้นไปยังคอมโพเนนต์หลายรายการได้ด้วย
val style = Style { background(Color.Blue) } // built in parameter BaseButton(onClick = { }, style = style) { BaseText("Button") } BaseText("Different text that uses the same style parameter", style = style) // modifier styleable val columnStyleState = remember { MutableStyleState(null) } Column( Modifier.styleable(columnStyleState, style) ) { BaseText("Column") } val rowStyleState = remember { MutableStyleState(null) } Row( Modifier.styleable(rowStyleState, style) ) { BaseText("Row") }
เพิ่มพร็อพเพอร์ตี้รูปแบบหลายรายการ
คุณเพิ่มพร็อพเพอร์ตี้ Style หลายรายการได้โดยการตั้งค่าพร็อพเพอร์ตี้ที่แตกต่างกันในแต่ละบรรทัด ดังนี้
BaseButton( onClick = { }, style = { background(Color.Blue) contentPaddingStart(16.dp) } ) { BaseText("Button") }
พร็อพเพอร์ตี้ในรูปแบบจะไม่เพิ่มขึ้นเหมือนกับการจัดรูปแบบตามตัวแก้ไข สไตล์จะใช้ค่าที่ตั้งล่าสุดในรายการพร็อพเพอร์ตี้ภายในบล็อกสไตล์เดียว ในตัวอย่างต่อไปนี้ เมื่อตั้งค่าพื้นหลัง 2 ครั้ง TealColor จะเป็นพื้นหลังที่ใช้
สำหรับระยะขอบ contentPaddingTop จะลบล้างระยะขอบด้านบน
ที่ตั้งค่าโดย contentPadding และจะไม่รวมค่า
BaseButton( style = { background(Color.Red) // Background of Red is now overridden with TealColor instead background(TealColor) // All directions of padding are set to 64.dp (top, start, end, bottom) contentPadding(64.dp) // Top padding is now set to 16.dp, all other paddings remain at 64.dp contentPaddingTop(16.dp) }, onClick = { // } ) { BaseText("Click me!") }
contentPadding
การลบล้างผสานออบเจ็กต์รูปแบบหลายรายการ
คุณสามารถสร้างออบเจ็กต์ Style หลายรายการและส่งไปยังพารามิเตอร์ style ของ Composable ได้
val style1 = Style { background(TealColor) } val style2 = Style { contentPaddingTop(16.dp) } BaseButton( style = style1 then style2, onClick = { }, ) { BaseText("Click me!") }
contentPaddingTopเมื่อสไตล์หลายรายการระบุพร็อพเพอร์ตี้เดียวกัน ระบบจะเลือกพร็อพเพอร์ตี้ที่ตั้งค่าล่าสุด เนื่องจากพร็อพเพอร์ตี้ไม่ได้เพิ่มในสไตล์ การเว้นวรรคสุดท้าย
ที่ส่งผ่านจะลบล้าง contentPaddingHorizontal ที่ตั้งค่าโดยการเว้นวรรคเริ่มต้น
contentPadding นอกจากนี้ สีพื้นหลังสุดท้ายจะลบล้าง
สีพื้นหลังที่ตั้งค่าโดยรูปแบบเริ่มต้นที่ส่งเข้ามา
val style1 = Style { background(Color.Red) contentPadding(32.dp) } val style2 = Style { contentPaddingHorizontal(8.dp) background(Color.LightGray) } BaseButton( style = style1 then style2, onClick = { }, ) { BaseText("Click me!") }
ในกรณีนี้ การจัดรูปแบบที่ใช้จะมีพื้นหลังสีเทาอ่อนและระยะห่างจากขอบ 32.dp
ยกเว้นระยะห่างจากขอบด้านซ้ายและขวาซึ่งมีค่าเป็น 8.dp
contentPadding ซึ่งสไตล์อื่นจะลบล้างการสืบทอดรูปแบบ
พร็อพเพอร์ตี้รูปแบบบางอย่าง เช่น contentColor และพร็อพเพอร์ตี้ที่เกี่ยวข้องกับรูปแบบข้อความ จะส่งต่อไปยัง Composable ลูก สไตล์ที่ตั้งค่าใน Composable ขององค์ประกอบย่อยจะลบล้างสไตล์ขององค์ประกอบหลักที่รับช่วงมาสำหรับองค์ประกอบย่อยนั้นๆ
Style, styleable และพารามิเตอร์โดยตรง| ลำดับความสำคัญ | วิธีการ | เอฟเฟ็กต์ |
|---|---|---|
| 1 (สูงสุด) | อาร์กิวเมนต์โดยตรงใน Composable | ลบล้างทุกอย่าง เช่น Text(color = Color.Red) |
| 2 | พารามิเตอร์รูปแบบ | การลบล้างรูปแบบในเครื่อง Text(style = Style { contentColor(Color.Red)} |
| 3 | เชนตัวปรับแต่ง | Modifier.styleable{ contentColor(Color.Red) ในคอมโพเนนต์เอง |
| 4 (ต่ำสุด) | สไตล์หลัก | สำหรับพร็อพเพอร์ตี้ที่รับช่วงได้ (การจัดรูปแบบข้อความ/สี) ที่ส่งต่อมาจากระดับบน |
การจัดรูปแบบระดับบน
คุณตั้งค่าพร็อพเพอร์ตี้ข้อความ (เช่น contentColor) จาก Composable ระดับบนสุดได้
และค่าดังกล่าวจะส่งต่อไปยัง Composable Text ย่อยทั้งหมด
val styleState = remember { MutableStyleState(null) } Column( modifier = Modifier.styleable(styleState) { background(Color.LightGray) val blue = Color(0xFF4285F4) val purple = Color(0xFFA250EA) val colors = listOf(blue, purple) contentBrush(Brush.linearGradient(colors)) }, ) { BaseText("Children inherit", style = { width(60.dp) }) BaseText("certain properties") BaseText("from their parents") }
การลบล้างพร็อพเพอร์ตี้ของพร็อพเพอร์ตี้ย่อย
นอกจากนี้ คุณยังตั้งค่าสไตล์ใน Text ที่ใช้ร่วมกันได้ที่เฉพาะเจาะจงได้ด้วย หาก Composable ระดับบนสุด
มีการตั้งค่าสไตล์ไว้ สไตล์ที่ตั้งค่าใน Composable ย่อยจะลบล้าง
สไตล์ของ Composable ระดับบนสุด
val styleState = remember { MutableStyleState(null) } Column( modifier = Modifier.styleable(styleState) { background(Color.LightGray) val blue = Color(0xFF4285F4) val purple = Color(0xFFA250EA) val colors = listOf(blue, purple) contentBrush(Brush.linearGradient(colors)) }, ) { BaseText("Children can ", style = { contentBrush(Brush.linearGradient(listOf(Color.Red, Color.Blue))) }) BaseText("override properties") BaseText("set by their parents") }
ใช้พร็อพเพอร์ตี้สไตล์ที่กำหนดเอง
คุณสร้างพร็อพเพอร์ตี้ที่กำหนดเองซึ่งแมปกับคำจำกัดความของสไตล์ที่มีอยู่ได้โดยใช้
ฟังก์ชันส่วนขยายใน StyleScope ดังตัวอย่างต่อไปนี้
fun StyleScope.outlinedBackground(color: Color) { border(1.dp, color) background(color) }
ใช้พร็อพเพอร์ตี้ใหม่นี้ภายในคำจำกัดความของสไตล์
val customExtensionStyle = Style { outlinedBackground(Color.Blue) }
ระบบไม่รองรับการสร้างพร็อพเพอร์ตี้ใหม่ที่จัดรูปแบบได้ หากกรณีการใช้งานของคุณ ต้องมีการสนับสนุนดังกล่าว โปรดส่งคำขอฟีเจอร์
อ่านค่า CompositionLocal
รูปแบบทั่วไปคือการจัดเก็บโทเค็นระบบการออกแบบภายใน CompositionLocal,
เพื่อเข้าถึงตัวแปรโดยไม่ต้องส่งเป็นพารามิเตอร์ สไตล์
เข้าถึง CompositionLocal เพื่อดึงค่าทั่วทั้งระบบภายในสไตล์ได้
val buttonStyle = Style { contentPadding(12.dp) shape(RoundedCornerShape(50)) background(Brush.verticalGradient(LocalCustomColors.currentValue.background)) }