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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

และยังสามารถปรับแต่งแถบส่วนหัวได้ 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 มีแฟล็ก 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() จะถูกเรียกด้วยชุดธงนี้ มีเพียงหน้าต่างที่มองเห็นได้ที่เป็นของ แอปพลิเคชันจะสามารถเข้าร่วมในการดำเนินการลากและรับเนื้อหาที่ลากได้

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

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

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

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

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

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

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