วันนี้ Jetpack Compose เวอร์ชันธันวาคม '25 พร้อมใช้งานแล้ว ซึ่งประกอบด้วยโมดูลหลักของ Compose เวอร์ชัน 1.10 และ Material 3 เวอร์ชัน 1.4 (ดูการแมป BOM แบบเต็ม) พร้อมฟีเจอร์ใหม่และการปรับปรุงประสิทธิภาพที่สำคัญ
หากต้องการใช้เวอร์ชันที่เผยแพร่ในวันนี้ ให้อัปเกรดเวอร์ชัน Compose BOM เป็น 2025.12.00 ดังนี้
implementation(platform("androidx.compose:compose-bom:2025.12.00"))การปรับปรุงประสิทธิภาพ
เราทราบดีว่าประสิทธิภาพการทำงานของแอปในรันไทม์มีความสำคัญอย่างยิ่งต่อคุณและผู้ใช้ ดังนั้นประสิทธิภาพจึงเป็นสิ่งสำคัญอันดับต้นๆ ของทีม Compose เวอร์ชันนี้มีการปรับปรุงหลายอย่าง และคุณจะได้รับประโยชน์ทั้งหมดเพียงแค่อัปเกรดเป็นเวอร์ชันล่าสุด การทดสอบประสิทธิภาพการเลื่อนภายในของเราแสดงให้เห็นว่าตอนนี้ Compose มีประสิทธิภาพเทียบเท่ากับการใช้ Views แล้ว
การทดสอบประสิทธิภาพการเลื่อนเพื่อเปรียบเทียบ Views กับ Jetpack Compose ใน Compose เวอร์ชันต่างๆ
การสร้างที่หยุดชั่วคราวได้ในการดึงข้อมูลล่วงหน้าแบบ Lazy
ตอนนี้ระบบจะเปิดใช้การสร้างที่หยุดชั่วคราวได้ในการดึงข้อมูลล่วงหน้าแบบ Lazy โดยค่าเริ่มต้น ซึ่งเป็นการเปลี่ยนแปลงพื้นฐานเกี่ยวกับวิธีที่รันไทม์ของ Compose กำหนดเวลาการทำงาน โดยออกแบบมาเพื่อลดการกระตุกอย่างมากระหว่างเวิร์กโหลด UI ที่หนัก
ก่อนหน้านี้ เมื่อการสร้างเริ่มต้นขึ้นแล้ว การสร้างนั้นจะต้องทำงานจนเสร็จสมบูรณ์ หากการสร้างมีความซับซ้อน การสร้างนั้นอาจบล็อกเทรดหลักนานกว่า 1 เฟรม ซึ่งทำให้ UI ค้าง แต่ตอนนี้การสร้างที่หยุดชั่วคราวได้ช่วยให้รันไทม์ "หยุดชั่วคราว" การทำงานได้หากเวลาใกล้หมด และกลับมาทำงานต่อในเฟรมถัดไป ซึ่งจะมีประสิทธิภาพเป็นพิเศษเมื่อใช้ร่วมกับการดึงข้อมูลล่วงหน้าของเลย์เอาต์แบบ Lazy เพื่อเตรียมเฟรมล่วงหน้า API CacheWindow ของเลย์เอาต์แบบ Lazy ที่เปิดตัวใน Compose 1.9 เป็นวิธีที่ยอดเยี่ยมในการดึงข้อมูลล่วงหน้าของเนื้อหาเพิ่มเติมและใช้ประโยชน์จากการสร้างที่หยุดชั่วคราวได้เพื่อสร้างประสิทธิภาพ UI ที่ราบรื่นยิ่งขึ้น
การสร้างที่หยุดชั่วคราวได้เมื่อใช้ร่วมกับการดึงข้อมูลล่วงหน้าแบบ Lazy จะช่วยลดการกระตุกได้
นอกจากนี้ เรายังได้เพิ่มประสิทธิภาพในส่วนอื่นๆ ด้วยการปรับปรุง Modifier.onPlaced, Modifier.onVisibilityChanged และการใช้งานตัวปรับแต่งอื่นๆ เราจะยังคงลงทุนในการปรับปรุงประสิทธิภาพของ Compose ต่อไป
ฟีเจอร์ใหม่
Retain
Compose มี API หลายรายการสำหรับเก็บและจัดการสถานะในวงจรชีวิตต่างๆ เช่น remember จะเก็บสถานะไว้ในคอมโพสิชันต่างๆ และ rememberSavable/rememberSerializable จะเก็บสถานะไว้เมื่อมีการสร้างกิจกรรมหรือกระบวนการขึ้นใหม่retain เป็น API ใหม่ที่อยู่ระหว่าง API เหล่านี้ ซึ่งช่วยให้คุณเก็บค่าไว้ได้เมื่อมีการเปลี่ยนแปลงการกำหนดค่าโดยไม่ต้องทำให้เป็นอนุกรม แต่จะเก็บค่าไว้ไม่ได้เมื่อการประมวลผลสิ้นสุด เนื่องจาก retain ไม่ได้ทำให้สถานะของคุณเป็นอนุกรม คุณจึงเก็บออบเจ็กต์ต่างๆ เช่น นิพจน์แลมบ์ดา โฟลว์ และออบเจ็กต์ขนาดใหญ่ เช่น บิตแมป ซึ่งทำให้เป็นอนุกรมได้ยาก ตัวอย่างเช่น คุณอาจใช้ retain เพื่อจัดการเครื่องเล่นสื่อ (เช่น ExoPlayer) เพื่อให้การเล่นสื่อไม่ถูกขัดจังหวะเมื่อมีการเปลี่ยนแปลงการกำหนดค่า
@Composable
fun MediaPlayer() {
val applicationContext = LocalContext.current.applicationContext
val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }
...
}เราขอขอบคุณชุมชน AndroidDev (โดยเฉพาะทีม Circuit) ที่มีส่วนร่วมและมีอิทธิพลต่อการออกแบบฟีเจอร์นี้
Material 1.4
ไลบรารี material3 เวอร์ชัน 1.4.0 มีคอมโพเนนต์และการปรับปรุงใหม่ๆ หลายรายการ ดังนี้
TextFieldตอนนี้มีเวอร์ชันที่อิงตามTextFieldStateซึ่งเป็นเวอร์ชันทดลองใช้ ซึ่งมีวิธีที่เสถียรมากขึ้นในการจัดการสถานะของข้อความ นอกจากนี้ ยังมีSecureTextFieldและOutlinedSecureTextFieldเวอร์ชันใหม่ให้ใช้งานแล้ว ตอนนี้คอมโพสได้Textของ Material รองรับลักษณะการทำงาน autoSize แล้ว- ตอนนี้คอมโพเนนต์แคโรเซลมีเวอร์ชัน
HorizontalCenteredHeroCarouselใหม่ให้ใช้งานแล้ว TimePickerตอนนี้รองรับการสลับระหว่างโหมดตัวเลือกและโหมดป้อนข้อมูลแล้ว- แฮนเดิลการลากแนวตั้งช่วยให้ผู้ใช้เปลี่ยนขนาดและ/หรือตำแหน่งของแผงแบบปรับอัตโนมัติได้
แคโรเซลฮีโร่แบบกึ่งกลางแนวนอน
โปรดทราบว่าเราจะยังคงพัฒนา Material 3 Expressive API ในเวอร์ชันอัลฟ่าของไลบรารี material3 ต่อไป ดูข้อมูลเพิ่มเติมได้ที่การบรรยายล่าสุดนี้
ฟีเจอร์แอนิเมชันใหม่
เราจะยังคงขยาย API แอนิเมชันต่อไป ซึ่งรวมถึงการอัปเดตสำหรับการปรับแต่งแอนิเมชันขององค์ประกอบแบบใช้ร่วมกัน
องค์ประกอบแบบใช้ร่วมกันแบบไดนามิก
โดยค่าเริ่มต้น แอนิเมชัน sharedElement() และ sharedBounds() จะพยายามสร้างแอนิเมชัน
การเปลี่ยนแปลงเลย์เอาต์ทุกครั้งที่พบคีย์ที่ตรงกันในสถานะเป้าหมาย อย่างไรก็ตาม คุณอาจต้องการปิดใช้แอนิเมชันนี้แบบไดนามิกตามเงื่อนไขบางอย่าง เช่น ทิศทางการนำทางหรือสถานะ UI ปัจจุบัน
หากต้องการควบคุมว่าจะมีการเปลี่ยนภาพขององค์ประกอบแบบใช้ร่วมกันหรือไม่ ตอนนี้คุณสามารถปรับแต่ง SharedContentConfig ที่ส่งไปยัง rememberSharedContentState() ได้แล้ว พร็อพเพอร์ตี้ isEnabled จะกำหนดว่าองค์ประกอบแบบใช้ร่วมกันใช้งานได้หรือไม่
SharedTransitionLayout {
val transition = updateTransition(currentState)
transition.AnimatedContent { targetState ->
// Create the configuration that depends on state changing.
fun animationConfig() : SharedTransitionScope.SharedContentConfig {
return object : SharedTransitionScope.SharedContentConfig {
override val SharedTransitionScope.SharedContentState.isEnabled: Boolean
get() =
// determine whether to perform a shared element transition
}
}
}ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบ
Modifier.skipToLookaheadPosition()
เราได้เพิ่มตัวปรับแต่งใหม่ Modifier.skipToLookaheadPosition() ในเวอร์ชันนี้ ซึ่งจะรักษาสถานะสุดท้ายของคอมโพสได้เมื่อทำการสร้างแอนิเมชันขององค์ประกอบแบบใช้ร่วมกัน ซึ่งช่วยให้สามารถสร้างการเปลี่ยนภาพ เช่น แอนิเมชันประเภท "การเปิดเผย" ได้ ดังที่เห็นในตัวอย่าง Androidify ที่มีการเปิดเผยกล้องแบบค่อยๆ ดูข้อมูลเพิ่มเติมได้ที่เคล็ดลับวิดีโอที่นี่
ความเร็วเริ่มต้นในการเปลี่ยนภาพขององค์ประกอบแบบใช้ร่วมกัน
เวอร์ชันนี้ได้เพิ่ม API การเปลี่ยนภาพขององค์ประกอบแบบใช้ร่วมกันใหม่ prepareTransitionWithInitialVelocity ซึ่งช่วยให้คุณส่งความเร็วเริ่มต้น (เช่น จากท่าทางสัมผัส) ไปยังการเปลี่ยนภาพขององค์ประกอบแบบใช้ร่วมกันได้
Modifier.fillMaxSize()
.draggable2D(
rememberDraggable2DState { offset += it },
onDragStopped = { velocity ->
// Set up the initial velocity for the upcoming shared element
// transition.
sharedContentStateForDraggableCat
?.prepareTransitionWithInitialVelocity(velocity)
showDetails = false
},
)
การเปลี่ยนภาพขององค์ประกอบแบบใช้ร่วมกันที่เริ่มต้นด้วยความเร็วเริ่มต้นจากท่าทางสัมผัส
การเปลี่ยนภาพแบบมีม่าน
EnterTransition และ ExitTransition จะกำหนดลักษณะที่คอมโพสได้ AnimatedVisibility/AnimatedContent ปรากฏหรือหายไป ตัวเลือกม่านแบบทดลองใช้ใหม่ช่วยให้คุณระบุสีเพื่อใช้เป็นม่านหรือฉากกั้นเนื้อหาได้ เช่น การค่อยๆ แสดง/ซ่อนเลเยอร์สีดำแบบกึ่งโปร่งแสงเหนือเนื้อหา
เนื้อหาแอนิเมชันแบบมีม่าน โปรดสังเกตม่าน (หรือฉากกั้น) แบบกึ่งโปร่งแสงเหนือเนื้อหาตารางระหว่างแอนิเมชัน
AnimatedContent(
targetState = page,
modifier = Modifier.fillMaxSize().weight(1f),
transitionSpec = {
if (targetState > initialState) {
(slideInHorizontally { it } togetherWith
slideOutHorizontally { -it / 2 } + veilOut(targetColor = veilColor))
} else {
slideInHorizontally { -it / 2 } +
unveilIn(initialColor = veilColor) togetherWith slideOutHorizontally { it }
}
},
) { targetPage ->
...
}
การเปลี่ยนแปลงที่กำลังจะเกิดขึ้น
การเลิกใช้งาน Modifier.onFirstVisible
Compose 1.9 ได้เปิดตัว Modifier.onVisibilityChanged และ Modifier.onFirstVisible หลังจากตรวจสอบความคิดเห็นของคุณแล้ว เราพบว่าสัญญาของ Modifier.onFirstVisible ไม่สามารถดำเนินการได้อย่างแน่นอน โดยเฉพาะอย่างยิ่งเมื่อรายการปรากฏ เป็นครั้งแรก ตัวอย่างเช่น เลย์เอาต์แบบ Lazy อาจกำจัดรายการที่เลื่อนออกนอกวิวพอร์ต แล้วสร้างรายการเหล่านั้นขึ้นมาอีกครั้งหากเลื่อนกลับเข้ามาในมุมมอง ในกรณีนี้ ระบบจะเรียกใช้โค้ดเรียกกลับ onFirstVisible อีกครั้ง เนื่องจากเป็นรายการที่สร้างขึ้นใหม่ ลักษณะการทำงานที่คล้ายกันนี้จะเกิดขึ้นเมื่อกลับไปที่หน้าจอที่เคยเข้าชมก่อนหน้านี้ซึ่งมี onFirstVisible ดังนั้น เราจึงตัดสินใจเลิกใช้งานตัวปรับแต่งนี้ใน Compose เวอร์ชันถัดไป (1.11) และแนะนำให้ย้ายข้อมูลไปใช้ onVisibilityChanged ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบ
การส่งโครูทีนในการทดสอบ
เราวางแผนที่จะเปลี่ยนการส่งโครูทีนในการทดสอบเพื่อปรับปรุงความไม่แน่นอนของการทดสอบและตรวจพบปัญหาเพิ่มเติม ปัจจุบันการทดสอบใช้ UnconfinedTestDispatcher ซึ่งแตกต่างจากลักษณะการทำงานในเวอร์ชันที่ใช้งานจริง เช่น เอฟเฟกต์อาจทำงานทันทีแทนที่จะเข้าคิว ในเวอร์ชันที่จะเผยแพร่ในอนาคต เราวางแผนที่จะเปิดตัว API ใหม่ที่ใช้ StandardTestDispatcher โดยค่าเริ่มต้นเพื่อให้ตรงกับลักษณะการทำงานในเวอร์ชันที่ใช้งานจริง คุณลองใช้ลักษณะการทำงานใหม่ตอนนี้ ในเวอร์ชัน 1.10 ได้แล้ว
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
การใช้ StandardTestDispatcher จะเข้าคิวงาน ดังนั้นคุณต้องใช้กลไกการซิงโครไนซ์ เช่น composeTestRule.waitForIdle() หรือ composeTestRule.runOnIdle() หากการทดสอบใช้ runTest คุณต้องตรวจสอบว่า runTest และกฎ Compose ของคุณใช้อินสแตนซ์ StandardTestDispatcher เดียวกันสำหรับการซิงโครไนซ์
// 1. Create a SINGLE dispatcher instance
val testDispatcher = StandardTestDispatcher()
// 2. Pass it to your Compose rule
@get:Rule
val composeRule = createComposeRule(effectContext = testDispatcher)
@Test
// 3. Pass the *SAME INSTANCE* to runTest
fun myTest() = runTest(testDispatcher) {
composeRule.setContent { /* ... */ }
}
เครื่องมือ
API ที่ยอดเยี่ยมควรมีเครื่องมือที่ยอดเยี่ยม และ Android Studio ได้เพิ่มฟีเจอร์ใหม่ๆ สำหรับนักพัฒนาแอป Compose ดังนี้
- Transform UI: ทำซ้ำการออกแบบโดยคลิกขวาที่
@Previewเลือก Transform UI แล้วอธิบายการเปลี่ยนแปลงด้วยภาษาธรรมชาติ - Generate
@Preview: คลิกขวาที่คอมโพสได้ แล้วเลือก Gemini > Generate [ชื่อคอมโพสได้] Preview - ปรับแต่ง Material Symbols ด้วยการรองรับรูปแบบไอคอนใหม่ในวิซาร์ด Vector Asset
- สร้างโค้ดจากภาพหน้าจอ หรือขอความช่วยเหลือจาก Gemini เพื่อจับคู่ UI ที่มีอยู่กับรูปภาพเป้าหมาย คุณสามารถใช้ฟีเจอร์นี้ร่วมกับการรองรับ MCP จากระยะไกลได้ เช่น เพื่อเชื่อมต่อกับไฟล์ Figma และสร้าง Compose UI จากการออกแบบ
- **Fix UI quality issues** จะตรวจสอบ UI เพื่อหาปัญหาที่พบบ่อย เช่น ปัญหาการช่วยเหลือพิเศษ แล้วเสนอวิธีแก้ไข
หากต้องการดูเครื่องมือเหล่านี้ในการทำงาน โปรดดูการสาธิตล่าสุดนี้
ขอให้สนุกกับการสร้างแอปด้วย Compose
เราจะยังคงลงทุนใน Jetpack Compose เพื่อมอบ API และเครื่องมือที่จำเป็นในการสร้าง UI ที่สวยงามและมีประสิทธิภาพสูงให้แก่คุณ เราให้ความสำคัญกับความคิดเห็นของคุณ โปรดแชร์ความคิดเห็นเกี่ยวกับการเปลี่ยนแปลงเหล่านี้หรือสิ่งที่คุณอยากเห็นต่อไปในเครื่องมือติดตามปัญหา
อ่านต่อ
-
ข่าวผลิตภัณฑ์
ในช่วงเกือบ 5 ปีที่ผ่านมานับตั้งแต่เปิดตัว Jetpack Compose เราได้ลงทุนเพื่อมอบฟีเจอร์ ประสิทธิภาพ และเครื่องมือทั้งหมดที่คุณต้องการในการสร้าง UI ที่ยอดเยี่ยมในอุปกรณ์ Android ที่หลากหลาย
Nick Butcher • ใช้เวลาอ่าน 2 นาที
-
ข่าวผลิตภัณฑ์
เรายินดีที่จะประกาศว่าการรองรับ Unreal Engine และ Godot อย่างเป็นทางการสำหรับ Android XR พร้อมให้บริการแล้ว นอกจากนี้ เรายังเปิดตัวเครื่องมือใหม่ที่ออกแบบมาเพื่อเพิ่มประสิทธิภาพการทำงานและเปิดใช้ความสามารถใหม่ๆ ของ XR ได้แก่ Android XR Engine Hub และ Android XR Interaction Framework
Luke Hopkins • ใช้เวลาอ่าน 4 นาที
-
ข่าวผลิตภัณฑ์
เมื่อมีการเปิดตัว Android 17 เราจะเปลี่ยนไปใช้มาตรฐานการพัฒนาแบบปรับอัตโนมัติเป็นหลัก ผู้ใช้ไม่ได้พึ่งพาฟอร์มแฟกเตอร์เดียวอีกต่อไป แต่จะสลับไปมาระหว่างโทรศัพท์ โทรศัพท์แบบพับได้ แท็บเล็ต แล็ปท็อป จอแสดงผลในรถยนต์ และสภาพแวดล้อม XR แบบสมจริงตลอดทั้งวัน
Fahd Imtiaz • ใช้เวลาอ่าน 4 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกล่าสุดเกี่ยวกับการพัฒนาแอป Android ส่งตรงถึงกล่องจดหมายของคุณ ทุกสัปดาห์