รองรับการจัดหน้าต่างเดสก์ท็อป

หน้าต่างเดสก์ท็อปช่วยให้ผู้ใช้เรียกใช้แอปหลายแอปพร้อมกันในหน้าต่างแอปที่ปรับขนาดได้เพื่อประสบการณ์การใช้งานที่หลากหลายและเหมือนเดสก์ท็อป

ในรูปที่ 1 คุณจะเห็นการจัดระเบียบหน้าจอที่มีการเปิดใช้หน้าต่างเดสก์ท็อป สิ่งที่ควรทราบ

  • ผู้ใช้สามารถเรียกใช้แอปหลายแอปพร้อมกันได้
  • แถบงานอยู่ในตำแหน่งคงที่ที่ด้านล่างของจอแสดงผลซึ่งแสดงแอปที่กำลังทำงาน ผู้ใช้สามารถปักหมุดแอปเพื่อการเข้าถึงด่วนได้
  • แถบส่วนหัวใหม่ที่ปรับแต่งได้จะตกแต่งที่ด้านบนของแต่ละหน้าต่างด้วยตัวควบคุม เช่น ย่อและขยาย
รูปที่ 1 หน้าต่างเดสก์ท็อปบนแท็บเล็ต

โดยค่าเริ่มต้น แอปจะเปิดแบบเต็มหน้าจอในแท็บเล็ต Android หากต้องการเปิดแอปในโหมดหน้าต่างเดสก์ท็อป ให้กดแฮนเดิลหน้าต่างที่ด้านบนของหน้าจอค้างไว้ แล้วลากแฮนเดิลภายใน UI ดังที่แสดงในรูปที่ 2

เมื่อแอปหนึ่งเปิดอยู่ในโหมดหน้าต่างเดสก์ท็อป แอปอื่นๆ ก็จะเปิดในหน้าต่างเดสก์ท็อปด้วย

รูปที่ 2 กดที่แถบแฮนเดิลของหน้าต่างแอปค้างไว้ แล้วลากเพื่อเข้าสู่โหมดหน้าต่างเดสก์ท็อป

นอกจากนี้ ผู้ใช้ยังเรียกใช้การแบ่งหน้าจอเดสก์ท็อปจากเมนูที่ปรากฏใต้แถบแฮนเดิลของหน้าต่างได้เมื่อแตะหรือคลิกแถบแฮนเดิล หรือใช้แป้นพิมพ์ลัด แป้น Meta (Windows, Command หรือ Search) + Ctrl + Down

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

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

การปรับขนาดได้และโหมดความเข้ากันได้

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

รูปที่ 3 การปรับขนาดหน้าต่างของแอปที่จำกัดให้ใช้เฉพาะแนวตั้งเป็นแนวนอน

แอปที่ประกาศว่าปรับขนาดไม่ได้ (resizeableActivity = false) จะมีการปรับขนาด UI ในขณะที่คงสัดส่วนภาพเดิมไว้

รูปที่ 4 UI ของแอปที่ปรับขนาดไม่ได้จะปรับขนาดตามหน้าต่างที่ปรับขนาด

แอปกล้องที่ล็อกการวางแนวหรือแจ้งว่าไม่สามารถปรับขนาดได้จะมีการทำงานพิเศษสำหรับช่องมองภาพของกล้อง นั่นคือ หน้าต่างสามารถปรับขนาดได้อย่างสมบูรณ์ แต่ช่องมองภาพจะคงสัดส่วนภาพเดิมไว้ การถือว่าแอปทำงานในแนวตั้งหรือแนวนอนเสมอจะทำให้แอปฮาร์ดโค้ดหรือทำการคาดเดาที่นำไปสู่การคํานวณการวางแนวหรือสัดส่วนการแสดงผลของตัวอย่างหรือรูปภาพที่จับได้ไม่ถูกต้อง ซึ่งส่งผลให้รูปภาพยืดออก วางแนวเอียง หรือกลับหัว

การดูแลเป็นพิเศษจะให้ประสบการณ์ของผู้ใช้ในระดับพื้นฐานที่จะลดผลกระทบจากการสันนิษฐานที่ไม่ถูกต้อง จนกว่าแอปจะพร้อมที่จะใช้ช่องมองภาพของกล้องที่ปรับเปลี่ยนได้เต็มรูปแบบ

ดูข้อมูลเพิ่มเติมเกี่ยวกับโหมดความเข้ากันได้สำหรับแอปกล้องได้ที่ โหมดความเข้ากันได้ของอุปกรณ์

รูปที่ 5 ช่องมองภาพของกล้องจะรักษาสัดส่วนภาพไว้เมื่อหน้าต่างปรับขนาด

ส่วนหัวที่ฝังที่กำหนดเองได้

แอปทั้งหมดที่ทำงานในโหมดหน้าต่างเดสก์ท็อปจะมีแถบส่วนหัว แม้ในโหมดสมจริง
ตรวจสอบว่าแถบส่วนหัวไม่ได้บดบังเนื้อหาของแอป แถบส่วนหัวคือแถบคำบรรยายแบบฝัง androidx.compose.foundation.layout.WindowInsets.Companion.captionBar() ในมุมมอง WindowInsets.Type.captionBar() ซึ่งเป็นส่วนหนึ่งของแถบระบบ

ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการส่วนตัดในแสดงเนื้อหาจากขอบถึงขอบในแอปและจัดการส่วนตัดของหน้าต่างในเครื่องมือเขียน

นอกจากนี้ คุณยังปรับแต่งแถบส่วนหัวได้ด้วย Android 15 ได้เปิดตัวประเภทลักษณะที่ปรากฏ APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND เพื่อทำให้แถบส่วนหัวโปร่งใสเพื่อให้แอปวาดเนื้อหาที่กำหนดเองภายในแถบส่วนหัวได้

จากนั้นแอปจะมีหน้าที่รับผิดชอบในการจัดรูปแบบส่วนบนของเนื้อหาให้ดูเหมือนแถบคำบรรยาย (พื้นหลัง เนื้อหาที่กำหนดเอง และอื่นๆ) ยกเว้นองค์ประกอบคำบรรยายของระบบ (ปุ่มปิดและขยาย) ซึ่งระบบจะวาดในแถบคำบรรยายแบบโปร่งใสที่ด้านบนของแอป

แอปจะสลับรูปลักษณ์ขององค์ประกอบระบบภายในคำบรรยายสำหรับธีมสว่างและมืดโดยใช้ APPEARANCE_LIGHT_CAPTION_BARS ได้เช่นเดียวกับการกดแถบสถานะและแถบนำทาง

นอกจากนี้ Android 15 ยังเปิดตัวเมธอด WindowInsets#getBoundingRects() ซึ่งช่วยให้แอปตรวจสอบส่วนแทรกของแถบคำบรรยายอย่างละเอียดยิ่งขึ้น แอปสามารถแยกแยะระหว่างพื้นที่ที่ระบบวาดองค์ประกอบของระบบและพื้นที่ที่ไม่ได้ใช้งานซึ่งแอปสามารถวางเนื้อหาที่กำหนดเองได้โดยไม่ทับซ้อนกับองค์ประกอบของระบบ

รายการออบเจ็กต์ Rect ที่ API แสดงจะระบุภูมิภาคของระบบที่ควรหลีกเลี่ยง พื้นที่ว่างที่เหลือ (คำนวณโดยการลบสี่เหลี่ยมผืนผ้าจากแถบคำบรรยาย) คือพื้นที่ที่แอปสามารถวาดเนื้อหาโดยไม่ซ้อนทับองค์ประกอบของระบบและสามารถรับอินพุตได้

Chrome ก่อนและหลังการใช้ส่วนหัวที่กำหนดเอง
รูปที่ 6 Chrome ก่อนและหลังการใช้ส่วนหัวที่กำหนดเอง

การรองรับการทำงานหลายอย่างพร้อมกันและอินสแตนซ์หลายรายการ

การทำงานหลายอย่างพร้อมกันเป็นหัวใจสำคัญของการใช้หน้าต่างบนเดสก์ท็อป และการอนุญาตให้ใช้อินสแตนซ์ของแอปหลายรายการจะช่วยเพิ่มประสิทธิภาพของผู้ใช้ได้อย่างมาก

Android 15 เปิดตัว PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI ซึ่งแอปสามารถตั้งค่าเพื่อระบุว่าควรแสดง UI ของระบบเพื่อให้แอปเปิดเป็นหลายอินสแตนซ์ได้

จัดการอินสแตนซ์แอปด้วยท่าทางสัมผัสการลาก

ในโหมดหลายหน้าต่าง ผู้ใช้สามารถเริ่มอินสแตนซ์แอปใหม่ได้โดยการลากองค์ประกอบมุมมองออกจากหน้าต่างของแอป นอกจากนี้ ผู้ใช้ยังย้ายองค์ประกอบระหว่างอินสแตนซ์ของแอปเดียวกันได้ด้วย

รูปที่ 7 เริ่มอินสแตนซ์ใหม่ของ Chrome โดยการลากแท็บออกจากหน้าต่างเดสก์ท็อป

Android 15 เปิดตัว Flag 2 รายการสำหรับปรับแต่งลักษณะการลากและวาง ดังนี้

  • DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG: บ่งบอกว่าควรมอบหมายการลากที่ไม่ได้รับการจัดการให้กับระบบเพื่อเริ่มการทำงานหากไม่มีหน้าต่างที่มองเห็นได้จัดการการปล่อย เมื่อใช้ Flag นี้ ผู้เรียกต้องระบุ ClipData ด้วย Item ที่มี IntentSender ที่ไม่เปลี่ยนแปลงได้สำหรับกิจกรรมที่จะเปิด (ดู ClipData.Item.Builder#setIntentSender()) ระบบจะเปิด Intent ได้หรือไม่นั้นขึ้นอยู่กับปัจจัยต่างๆ เช่น ขนาดหน้าจอปัจจุบันหรือโหมดการแบ่งหน้าจอ หากระบบไม่เปิดใช้งาน Intent ระบบจะยกเลิก Intent โดยใช้ขั้นตอนการลากและวางตามปกติ

  • DRAG_FLAG_GLOBAL_SAME_APPLICATION: บ่งบอกว่าการดำเนินการลากสามารถข้ามขอบเขตของหน้าต่างได้ (สำหรับอินสแตนซ์หลายรายการของแอปพลิเคชันเดียวกัน)

    เมื่อมีการเรียกใช้ startDragAndDrop() ด้วยการตั้งค่า Flag นี้ จะมีเพียงหน้าต่างที่ปรากฏที่เป็นของแอปพลิเคชันเดียวกันเท่านั้นที่มีส่วนร่วมในการดำเนินการลากและรับเนื้อหาที่ลากได้

รูปที่ 8 ย้ายแท็บไปมาระหว่างแอป Chrome 2 อินสแตนซ์

การเพิ่มประสิทธิภาพเพิ่มเติม

ปรับแต่งการเปิดแอปและการเปลี่ยนแอปจากโหมดหน้าต่างบนเดสก์ท็อปเป็นโหมดเต็มหน้าจอ

ระบุขนาดและตำแหน่งเริ่มต้น

แอปบางแอปอาจปรับขนาดไม่ได้ แต่จำเป็นต้องมีหน้าต่างขนาดใหญ่เพื่อนำเสนอคุณค่าต่อผู้ใช้ คุณสามารถใช้เมธอด ActivityOptions#setLaunchBounds() เพื่อระบุขนาดและตําแหน่งเริ่มต้นเมื่อเปิดใช้งานกิจกรรม

เข้าสู่โหมดเต็มหน้าจอจากพื้นที่ทำงานบนเดสก์ท็อป

แอปจะแสดงแบบเต็มหน้าจอได้โดยการโทรหา Activity#requestFullScreenMode() วิธีนี้จะแสดงแอปแบบเต็มหน้าจอจากหน้าต่างเดสก์ท็อปโดยตรง