รองรับอุปกรณ์พับสามทบและอุปกรณ์พับได้ในแนวนอน

โทรศัพท์แบบพับได้แนวนอนในท่าทางปิดและเปิดจนสุดวางอยู่ข้างโทรศัพท์แบบพับสามทบในท่าทางปิดและเปิดจนสุด

นักพัฒนาแอปมักพบกับความยากลำบากที่ไม่เหมือนใครเมื่อสร้างแอปพลิเคชันสำหรับอุปกรณ์แบบพับได้ โดยเฉพาะอย่างยิ่งอุปกรณ์อย่าง Samsung Trifold หรือ Pixel Fold รุ่นแรก ซึ่งเปิดในรูปแบบแนวนอน (rotation_0 = แนวนอน) ข้อผิดพลาดที่นักพัฒนาแอปมักทำ ได้แก่

  • สมมติฐานเกี่ยวกับการวางแนวของอุปกรณ์ไม่ถูกต้อง
  • มองข้ามกรณีการใช้งาน
  • ไม่คำนวณใหม่หรือแคชค่าเมื่อมีการเปลี่ยนแปลงการกำหนดค่า

ปัญหาเฉพาะที่เกี่ยวข้องกับอุปกรณ์ ได้แก่

  • การวางแนวตามธรรมชาติของอุปกรณ์ไม่ตรงกันระหว่างจอแสดงผลด้านนอกและด้านใน (สมมติฐานอิงตาม rotation_0 = แนวตั้ง) ซึ่งทำให้แอปทำงานล้มเหลวเมื่อพับและกางออก
  • ความหนาแน่นของหน้าจอแตกต่างกันและการจัดการการเปลี่ยนแปลงการกำหนดค่า density ไม่ถูกต้อง
  • ปัญหาการแสดงตัวอย่างจากกล้องที่เกิดจากการที่เซ็นเซอร์กล้องต้องอิงกับการวางแนวตามธรรมชาติ

หากต้องการมอบประสบการณ์การใช้งานคุณภาพสูงบนอุปกรณ์แบบพับได้ ให้มุ่งเน้นที่ส่วนสำคัญต่อไปนี้

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

สร้างแอปที่ปรับเปลี่ยนตามอุปกรณ์

หากแอปของคุณปรับเปลี่ยนตามอุปกรณ์อยู่แล้วและเป็นไปตามระดับที่เพิ่มประสิทธิภาพ (ระดับที่ 2) ที่ระบุไว้ในหลักเกณฑ์ด้านคุณภาพแอปที่ปรับเปลี่ยนตามอุปกรณ์ แอปควรทำงานได้ดีในอุปกรณ์แบบพับได้ หากไม่เป็นเช่นนั้น ให้ตรวจสอบรายละเอียดเฉพาะของอุปกรณ์แบบพับได้ 3 ทบและแบบพับได้แนวนอนอีกครั้ง รวมถึงตรวจสอบแนวคิดพื้นฐานต่อไปนี้เกี่ยวกับการพัฒนาแอปที่ปรับเปลี่ยนตามอุปกรณ์สำหรับ Android

เลย์เอาต์แบบปรับอัตโนมัติ

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

  • ออกแบบและใช้เลย์เอาต์แบบปรับอัตโนมัติ
  • ปรับการนำทางหลักของแอปตามขนาดหน้าต่าง
  • ใช้คลาสขนาดหน้าต่างเพื่อปรับ UI ของแอป
  • ลดความซับซ้อนในการใช้เลย์เอาต์ Canonical เช่น รายการ-รายละเอียด โดยใช้ Jetpack API
แอปที่แสดงแบบกล่องจดหมายบนอุปกรณ์แบบพับได้ที่เปิดอยู่ และแอปเดียวกันแบบเต็มหน้าจอที่มีเลย์เอาต์แบบปรับได้บนอุปกรณ์แบบพับได้อีกเครื่องที่เปิดอยู่
รูปที่ 1 ความแตกต่างระหว่างเลย์เอาต์ที่ไม่ปรับอัตโนมัติ (แบบมีขอบดำ) กับเลย์เอาต์แบบปรับอัตโนมัติ

คลาสขนาดหน้าต่าง

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

ภาพแอปบนอุปกรณ์ที่มีขนาดตามคลาสขนาดหน้าต่างแบบกะทัดรัด ปานกลาง และขยาย
รูปที่ 2 คลาสขนาดหน้าต่าง

ตัวอย่างต่อไปนี้ใช้ไลบรารีแบบปรับอัตโนมัติของ Material 3 เพื่อกำหนดพื้นที่ที่แอปมี โดยเรียกใช้ฟังก์ชัน currentWindowAdaptiveInfo()ก่อน จากนั้นใช้เลย์เอาต์ที่เกี่ยวข้อง สำหรับคลาสขนาดหน้าต่าง 3 คลาส

val adaptiveInfo = currentWindowAdaptiveInfo()
val windowSizeClass = adaptiveInfo.windowSizeClass

when {
  windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND) -> // Expanded
  windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_MEDIUM_LOWER_BOUND) -> // Medium
  else -> // Compact
}

ดูข้อมูลเพิ่มเติมได้ที่หัวข้อใช้คลาสขนาดหน้าต่าง

คุณภาพแอปที่ปรับเปลี่ยนตามอุปกรณ์

การปฏิบัติตามระดับที่ 2 (แอปที่ปรับเปลี่ยนตามอุปกรณ์และเพิ่มประสิทธิภาพแล้ว) หรือระดับที่ 1 (แอปที่ปรับเปลี่ยนตามอุปกรณ์และแตกต่าง) ของหลักเกณฑ์ด้านคุณภาพแอปที่ปรับเปลี่ยนตามอุปกรณ์จะช่วยให้แอปมอบประสบการณ์การใช้งานที่น่าสนใจแก่ผู้ใช้ในอุปกรณ์แบบพับได้ 3 ทบ อุปกรณ์แบบพับได้แนวนอน และอุปกรณ์หน้าจอขนาดใหญ่อื่นๆ หลักเกณฑ์นี้ครอบคลุมการตรวจสอบที่สำคัญในระดับต่างๆ เพื่อเปลี่ยนจากแอปที่พร้อมปรับเปลี่ยนตามอุปกรณ์ไปเป็นแอปที่มอบประสบการณ์ที่แตกต่าง

Android 16 ขึ้นไป

สำหรับแอปที่กำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ขึ้นไป ระบบจะไม่ใช้ข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนภาพในจอแสดงผลที่มีความกว้างที่เล็กที่สุด >= 600dp แอปจะเติมหน้าต่างแสดงผลทั้งหมด ไม่ว่า สัดส่วนภาพจะเป็นอย่างไรหรือผู้ใช้จะชอบการวางแนวแบบใด และระบบจะไม่ใช้โคนความเข้ากันได้แบบมีขอบดำ อีกต่อไป

สิ่งที่ควรพิจารณาเป็นพิเศษ

อุปกรณ์แบบพับได้ 3 ทบและแบบพับได้แนวนอนมีลักษณะการทำงานของฮาร์ดแวร์ที่ไม่เหมือนใครซึ่งต้องมีการจัดการเฉพาะ โดยเฉพาะอย่างยิ่งในส่วนของเซ็นเซอร์ การแสดงตัวอย่างจากกล้อง และความต่อเนื่องของการกำหนดค่า (การเก็บสถานะไว้เมื่อพับ กางออก หรือปรับขนาด)

การแสดงตัวอย่างจากกล้อง

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

สมมติฐานไม่ตรงกัน

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

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

วิธีแก้ปัญหาที่ 1: Jetpack CameraX (แนะนำ)

วิธีแก้ปัญหาที่ง่ายและมีประสิทธิภาพมากที่สุดคือการใช้ไลบรารี Jetpack CameraX องค์ประกอบ UI PreviewView ออกแบบมาเพื่อจัดการความซับซ้อนทั้งหมดของการแสดงตัวอย่าง โดยอัตโนมัติ:

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

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

วิธีแก้ปัญหาที่ 2: CameraViewfinder

หากคุณใช้โค้ดเบส Camera2 อยู่แล้ว ไลบรารี CameraViewfinder (เข้ากันได้กับ API ระดับ 21) ก็เป็นอีกวิธีแก้ปัญหาที่ทันสมัย โดยจะช่วยลดความซับซ้อนในการแสดงฟีดกล้องโดยใช้ TextureView หรือ SurfaceView และใช้การแปลงที่จำเป็นทั้งหมด (สัดส่วนภาพ การปรับขนาด และการหมุน) ให้คุณ

ดูข้อมูลเพิ่มเติมได้ที่บล็อกโพสต์แนะนำ Camera Viewfinder และ คู่มือนักพัฒนาแอปเกี่ยวกับการแสดงตัวอย่างจากกล้อง

วิธีแก้ปัญหาที่ 3: การใช้ Camera2 ด้วยตนเอง

หากคุณใช้ CameraX หรือ CameraViewfinder ไม่ได้ คุณต้องคำนวณการวางแนวและสัดส่วนภาพด้วยตนเอง และตรวจสอบว่าได้อัปเดตการคำนวณเมื่อมีการเปลี่ยนแปลงการกำหนดค่าแต่ละครั้ง

  • รับการวางแนวเซ็นเซอร์กล้อง (เช่น 0, 90, 180, 270 องศา) จาก CameraCharacteristics
  • รับการหมุนจอแสดงผลปัจจุบันของอุปกรณ์ (เช่น 0, 90, 180, 270 องศา)
  • ใช้ค่าทั้ง 2 นี้เพื่อกำหนดการแปลงที่จำเป็นสำหรับ SurfaceView หรือ TextureView
  • ตรวจสอบว่าสัดส่วนภาพของ Surface เอาต์พุตตรงกับสัดส่วนภาพของการแสดงตัวอย่างจากกล้องเพื่อป้องกันการบิดเบือน
  • แอปกล้องอาจทำงานในส่วนหนึ่งของหน้าจอ ไม่ว่าจะเป็นในโหมดหลายหน้าต่างหรือโหมดการแสดงหน้าต่างบนเดสก์ท็อป หรือในจอแสดงผลที่เชื่อมต่อ ด้วยเหตุนี้ คุณจึงไม่ควรใช้ขนาดหน้าจอเพื่อกำหนดขนาดของช่องมองภาพกล้อง แต่ให้ใช้ เมตริกหน้าต่าง แทน

ดูข้อมูลเพิ่มเติมได้ที่คู่มือนักพัฒนาแอปเกี่ยวกับการแสดงตัวอย่างจากกล้องCamera previewและวิดีโอYour แอปกล้องในรูปแบบของอุปกรณ์ต่างๆ

วิธีแก้ปัญหาที่ 4: ดำเนินการพื้นฐานของกล้องโดยใช้ Intent

หากไม่ต้องการฟีเจอร์กล้องมากมาย วิธีแก้ปัญหาที่ตรงไปตรงมาคือการดำเนินการพื้นฐานของกล้อง เช่น การถ่ายภาพหรือวิดีโอโดยใช้แอปพลิเคชันกล้องเริ่มต้นของอุปกรณ์ คุณไม่จำเป็นต้องผสานรวมกับไลบรารีกล้อง แต่ให้ใช้ Intent แทน

ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ Intent ของกล้อง

การกำหนดค่าและความต่อเนื่อง

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

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

การเปลี่ยนแปลงการกำหนดค่าที่เกิดขึ้นบ่อยๆ ได้แก่ screenSize, smallestScreenSize, screenLayout, orientation, density, fontScale, touchscreen และ keyboard

ดู android:configChanges และ จัดการการเปลี่ยนแปลงการกำหนดค่า ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการสถานะของแอปได้ที่หัวข้อบันทึกสถานะ UI

การเปลี่ยนแปลงการกำหนดค่าความหนาแน่น

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

การกำหนดค่า AndroidManifest.xml

  • density: ประกาศว่าแอปจะจัดการการเปลี่ยนแปลงความหนาแน่นของหน้าจอ
  • การเปลี่ยนแปลงการกำหนดค่าอื่นๆ: คุณควรประกาศการเปลี่ยนแปลงการกำหนดค่าอื่นๆ ที่เกิดขึ้นบ่อยๆ ด้วย เช่น screenSize, orientation, keyboardHidden, fontScale และอื่นๆ

การประกาศความหนาแน่น (และการเปลี่ยนแปลงการกำหนดค่าอื่นๆ) จะป้องกันไม่ให้ระบบรีสตาร์ทกิจกรรม แต่จะเรียกใช้ onConfigurationChanged() แทน

การใช้ onConfigurationChanged()

เมื่อความหนาแน่นเปลี่ยนแปลง คุณต้องอัปเดตทรัพยากร (เช่น โหลดบิตแมปใหม่หรือคำนวณขนาดเลย์เอาต์ใหม่) ในการเรียกกลับ

  • ตรวจสอบว่า DPI เปลี่ยนเป็น newConfig.densityDpi
  • รีเซ็ตมุมมองที่กำหนดเอง Drawable ที่กำหนดเอง และอื่นๆ เป็นความหนาแน่นใหม่

รายการทรัพยากรที่จะประมวลผล

  • ทรัพยากรรูปภาพ: แทนที่บิตแมปและ Drawable ด้วยทรัพยากรเฉพาะความหนาแน่น หรือปรับขนาดโดยตรง
  • หน่วยเลย์เอาต์ (การแปลง dp เป็น px): คำนวณขนาด มุมขอบ ระยะห่างภายในของมุมมองใหม่
  • ขนาดแบบอักษรและข้อความ: ใช้ขนาดข้อความหน่วย sp อีกครั้ง
  • การวาด View/Canvas ที่กำหนดเอง: อัปเดตค่าที่อิงตามพิกเซลที่ใช้ในการ วาด Canvas

การกำหนดการวางแนวของแอป

อย่าอิงกับการหมุนทางกายภาพของอุปกรณ์เมื่อสร้างแอปที่ปรับเปลี่ยนตามอุปกรณ์ เนื่องจากระบบ จะละเว้นการหมุนนี้ในอุปกรณ์หน้าจอขนาดใหญ่ และแอปในโหมดหลายหน้าต่าง อาจมีการวางแนวที่แตกต่างจากอุปกรณ์ แต่ให้ใช้ Configuration.orientation หรือ WindowMetrics เพื่อระบุว่าแอปอยู่ในแนวนอนหรือแนวตั้งในปัจจุบันโดยอิงตามขนาดหน้าต่าง

วิธีแก้ปัญหาที่ 1: ใช้ Configuration.orientation

พร็อพเพอร์ตี้นี้จะระบุการวางแนวที่แอปแสดงอยู่ในปัจจุบัน

วิธีแก้ปัญหาที่ 2: ใช้ WindowMetrics#getBounds()

คุณสามารถรับขอบเขตการแสดงผลปัจจุบันของแอป และตรวจสอบความกว้างและความสูงเพื่อกำหนดการวางแนว

หากต้องการจำกัดการวางแนวของแอปในโทรศัพท์ (หรือหน้าจอด้านนอกของ อุปกรณ์แบบพับได้) แต่ไม่จำกัดในอุปกรณ์หน้าจอขนาดใหญ่ โปรดดูหัวข้อการวางแนวของแอปถูกจำกัดในโทรศัพท์แต่ไม่จำกัดในหน้าจอขนาดใหญ่

ท่าทางและโหมดการแสดงผล

อุปกรณ์แบบพับได้แนวตั้งและแนวนอนรองรับท่าทางและสถานะของอุปกรณ์แบบพับได้ เช่น ท่าทางแบบวางบนโต๊ะและ HALF_OPENED รองรับโดยอุปกรณ์แบบพับได้แนวตั้งและแนวนอน อย่างไรก็ตาม อุปกรณ์แบบพับได้ 3 ทบไม่รองรับท่าทางแบบวางบนโต๊ะและใช้ HALF_OPENED ไม่ได้ แต่จะแสดงหน้าจอที่ใหญ่ขึ้นเพื่อมอบประสบการณ์การใช้งานที่ไม่เหมือนใครเมื่อกางออกจนสุด

หากต้องการแยกความแตกต่างของแอปในอุปกรณ์แบบพับได้ที่รองรับ HALF_OPENED ให้ใช้ Jetpack WindowManager API เช่น FoldingFeature

ดูข้อมูลเพิ่มเติมเกี่ยวกับท่าทาง สถานะ และการรองรับการแสดงตัวอย่างจากกล้องของอุปกรณ์แบบพับได้ได้ในคู่มือนักพัฒนาแอปต่อไปนี้

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

การล็อกการวางแนวให้เป็นการวางแนวเซ็นเซอร์ตามธรรมชาติ

สำหรับกรณีการใช้งานที่เฉพาะเจาะจงมาก โดยเฉพาะอย่างยิ่งแอปที่ต้องใช้ทั้งหน้าจอโดยไม่เกี่ยวข้องกับสถานะการพับของอุปกรณ์ แฟล็ก nosensor จะช่วยให้คุณล็อกแอปให้เป็นการวางแนวตามธรรมชาติของอุปกรณ์ได้ ตัวอย่างเช่น ใน Pixel Fold การวางแนวตามธรรมชาติของอุปกรณ์เมื่อพับคือแนวตั้ง ส่วนการวางแนวตามธรรมชาติเมื่อกางออกคือแนวนอน การเพิ่มแฟล็ก nosensor จะบังคับให้แอปถูกล็อกในแนวตั้งเมื่อทำงานบนจอแสดงผลด้านนอก และล็อกในแนวนอนเมื่อทำงานบนจอแสดงผลด้านใน

<activity
  android:name=".MainActivity"
  android:screenOrientation="nosensor">

การรีแมปเซ็นเซอร์สำหรับเกมและ XR

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

หากต้องการแก้ไขปัญหานี้ ให้ตรวจสอบ Display.getRotation() ปัจจุบันและรีแมป แกนตามความเหมาะสม

  • การหมุน 0: x=x, y=y
  • การหมุน 90: x=-y, y=x
  • การหมุน 180: x=-x, y=-y
  • การหมุน 270: x=y, y=-x

สำหรับเวกเตอร์การหมุน (ใช้ในแอปเข็มทิศหรือแอป XR) ให้ใช้ SensorManager.remapCoordinateSystem() เพื่อแมปทิศทางเลนส์กล้องหรือ ด้านบนของหน้าจอไปยังแกนใหม่โดยอิงตามการหมุนปัจจุบัน

ความเข้ากันได้ของแอป

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

ดูข้อมูลเพิ่มเติมได้จากรายการวิธีแก้ปัญหาความเข้ากันได้ที่ครอบคลุมซึ่งมีให้ในแพลตฟอร์ม โดยเฉพาะอย่างยิ่งวิธีแก้ปัญหาที่เกี่ยวข้องกับการแสดงตัวอย่างจากกล้อง การลบล้าง และการเปลี่ยนแปลง Android 16 API ที่อาจเปลี่ยนลักษณะการทำงานของแอป

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