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

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

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

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

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

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

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

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

สร้างแบบปรับอัตโนมัติ

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

เลย์เอาต์แบบปรับขนาดได้

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

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

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

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

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

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

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

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

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

คุณภาพแอปบนหน้าจอขนาดใหญ่

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

Android 16 ขึ้นไป

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

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

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

ตัวอย่างจากกล้อง

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

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

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

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

โซลูชันที่ 1: Jetpack CameraX (ดีที่สุด)

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

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

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

วิธีที่ 2: CameraViewfinder

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

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

โซลูชันที่ 3: การใช้งาน Camera2 ด้วยตนเอง

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

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

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

วิธีที่ 4: ดำเนินการพื้นฐานของกล้องโดยใช้ 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 รองรับทั้งอุปกรณ์พับได้แนวตั้งและแนวนอน อย่างไรก็ตาม โทรศัพท์แบบพับสามทบ ไม่รองรับท่าทางบนโต๊ะและใช้ 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() เพื่อแมปทิศทางเลนส์กล้องหรือด้านบนของหน้าจอไปยังแกนใหม่ตามการหมุนปัจจุบัน

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

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

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

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