การทำให้ Foldable Android Emulator รองรับ Posture ในรูปแบบต่างๆ

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

ซึ่ง Posture สำหรับ Foldable Devices บนแอนดรอยด์จะมีอยู่ทั้งหมด 5 รูปแบบด้วยกัน

  • Closed (พับจอ)
  • Open (กางเต็มจอ)
  • Half-open (เปิดหน้าจอแค่ครึ่งเดียว)
  • Flipped (พับครึ่งในแนวตั้ง)
  • Tent (พับครึ่งในแนวนอน)

โดยที่ Foldable Devices จะไม่ได้รองรับครบทั้งหมด 5 รูปแบบ แต่จะขึ้นอยู่กับอุปกรณ์แอนดรอยด์แต่ละรุ่นว่ามีรูปแบบในการพับ/กางจอในรูปแบบไหน ซึ่งแต่ละรุ่นก็จะมี Posture แค่ 2-3 แบบเท่านั้น

ยกตัวอย่างเช่น

ภาพจาก The Verge

ภาพข้างบนนี้คือ Samsung Galaxy Z Flip ที่เป็น Foldable Devices ที่สามารถพับหน้าจอครึ่งนึงเพื่อปิดได้ ซึ่งจะมี Posture ทั้งหมด 3 รูปแบบด้วยกันคือ Closed, Half-open และ Open (เรียงตามลำดับ)

และการทำให้แอปสามารถรู้ได้ว่า ณ เวลานั้น อุปกรณ์แอนดรอยด์กำลังอยู่ใน Posture รูปแบบไหน ก็จะมี Library จาก Android Jetpack ที่ชื่อว่า Window Manager เพื่อช่วยจัดการเรื่องนี้ให้โดยเฉพาะ ซึ่งจะช่วยให้นักพัฒนาสามารถใส่ลูกเล่นในการแสดงผลในแอปให้เหมาะสมกับ Posture แบบต่างๆได้

Window Manager | Android Developers

หรือถ้าอยากรู้ว่าหน้าจอกาง/พับกี่องศาก็สามารถใช้ Hinge API ที่เพิ่มเข้ามาใหม่ใน Android 11 ก็ได้เช่นกัน

นักพัฒนาต้องซื้อเครื่องจริงมาทดสอบหรือป่าว?

ไม่ต้องซื้อเครื่องมาเพื่อใช้ทดสอบนะ (จะซื้อมาใช้ก็ได้ แต่ราคาก็จะแรงหน่อย) เพราะในปัจจุบันนี้ นักพัฒนาสามารถสร้าง Android Emulator เพื่อแสดงผลแบบ Foldable Devices ได้แล้ว

โดยจะมีหน้าจอให้เลือกอยู่ 2 แบบด้วยกันคือ 7.3" Foldable กับ  8.4" Foldable

แต่เมื่อลองใช้งานดูก็จะพบว่า สามารถกดพับ/กางหน้าจอได้ แต่ไม่สามารถกำหนดมุมหรือองศาที่ต้องการได้เลย ทำให้ Posture ที่เกิดขึ้นได้นั้นมีแค่ 2 แบบเท่านั้น คือ Closed กับ Open

นั่นหมายความว่านักพัฒนาจะไม่สามารถทดสอบแอปกับ Posture แบบ Half-open ได้เลย

ถ้าอยากทดสอบกับ Posture รูปแบบอื่นๆด้วยล่ะ?

จริงๆแล้ว Android Emulator นั้นรองรับการกำหนดองศาเพื่อพับ/กางหน้าจอด้วย แต่ทว่านักพัฒนาต้องกำหนดค่าต่างๆเพิ่มเข้าไปเพื่อให้กำหนดองศาผ่านเมนู Fold ที่อยู่ใน Virtual Sensors ของ Emulator ได้

อย่าลืมว่าจะต้องเป็น Android 10 ขึ้นไปนะ

ซึ่งการสร้าง Emulator ขึ้นมาแบบปกติจะไม่แสดงเมนูนี้ให้ เนื่องจาก Emulator ไม่ได้กำหนดค่าสำหรับ Hinge Sensor ให้ตั้งแต่แรก

ดังนั้นนักพัฒนาจะต้องกำหนดค่าสำหรับ Hinge Sensor เพิ่มเข้าไปใน Emulator เพื่อให้สามารถใช้งานเมนู Fold ได้นั่นเอง

การกำหนดค่าให้กับ Android Emulator ให้รองรับ Hinge Sensor

นักพัฒนาสามารถกำหนดค่าต่างๆให้กับ Emulator ได้ผ่านไฟล์ config.ini ที่อยู่ใน Directory ของ Emulator ได้ โดยที่

  • macOS หรือ Linux : /Users/<USERNAME>/.android/avd/
  • Windows : C:\Users\<USERNAME>\.android\avd

แล้วเปิดไฟล์ config.ini ด้วย Text Editor ตัวใดก็ได้เพื่อแก้ไขข้อมูลของ Emulator ตัวที่ต้องการ

เมื่อเปิดไฟล์ดังกล่าวขึ้นมาก็จะพบกับ Config ต่างๆของ Emulator (แต่ไม่มี Config สำหรับ Hinge Sensor เลย)

ก็ให้เพิ่ม Config สำหรับ Hinge Sensor ต่อท้ายเข้าไป ยกตัวอย่างเช่น

// config.ini
...
hw.sensor.hinge = yes
hw.sensor.hinge.count = 1
hw.sensor.hinge.type = 1
hw.sensor.hinge.ranges = 180-360
hw.sensor.hinge.defaults = 180
hw.sensor.hinge.areas = 52.2-0
hw.sensor.posture_list = 4, 3
hw.sensor.hinge_angles_posture_definitions = 210-360,180-210
hw.sensor.hinge.fold_to_displayRegion.0.1_at_posture = 4

จากนั้นบันทึกไฟล์ แล้วเปิด Emulator ขึ้นมาได้เลย ก็จะพบว่ามีเมนู Fold ใน Virtual Sensors เพิ่มเข้ามาเป็นที่เรียบร้อยแล้ว

Hinge Sensor Configuration สำหรับ Android Emulator ขนาดต่างๆ

เพื่อไม่ให้เสียเวลา เจ้าของบล็อกจึงได้รวบรวม Config ของ Hinge Sensor ของหน้าจอขนาดต่างๆไว้ให้เรียบร้อยแล้ว เพื่อให้นักพัฒนาสามารถทดสอบกับ Posture ในรูปแบบต่างๆได้

7.3" Foldable

เนื่องจากหน้าจอตอนกางกับตอนพับมีขนาดแตกต่างกันชัดเจน คล้ายๆกับ Samsung Galaxy Z Fold

เจ้าของบล็อกจึงกำหนดให้หน้าจอขนาด 7.3" แสดง Posture ในรูปแบบของอุปกรณ์ที่มีหน้าจอ 2 ด้าน ด้านหนึ่งเป็นหน้าจอขนาดเล็ก และอีกด้านหนึ่งเป็นหน้าจอขนาดใหญ่ เพื่อให้พับครึ่งในแนวตั้งแล้วแสดงผลอีกหน้าจอได้

// 7.3" Foldable
hw.sensor.hinge = yes
hw.sensor.hinge.count = 1
hw.sensor.hinge.type = 1
hw.sensor.hinge.ranges = 0-180
hw.sensor.hinge.defaults = 180
hw.sensor.hinge.areas = 768-0-1-768
hw.sensor.posture_list = 1,2,3
hw.sensor.hinge_angles_posture_definitions = 0-30,30-150,150-180
hw.sensor.hinge.fold_to_displayRegion.0.1_at_posture = 1

โดยจะมี Posture อยู่ทั้งหมด 3 แบบด้วยกันคือ Closed, Half-open และ Open

8" Foldable

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

// 8" Foldable
hw.sensor.hinge = yes
hw.sensor.hinge.count = 1
hw.sensor.hinge.type = 1
hw.sensor.hinge.ranges = 180-360
hw.sensor.hinge.defaults = 180
hw.sensor.hinge.areas = 52.2-0
hw.sensor.posture_list = 4, 3
hw.sensor.hinge_angles_posture_definitions = 210-360,180-210 
hw.sensor.hinge.fold_to_displayRegion.0.1_at_posture = 4

โดยจะมี Posture อยู่ทั้งหมด 2 แบบด้วยกันคือ Flipped และ Open

Pixel 3

เพื่อให้สามารถทดสอบกับอุปกรณ์ที่พับครึ่งจอเพื่อปิด เหมือนกับ Samsung Galaxy Z Flip ได้ เจ้าของบล็อกจึงหยิบ Pixel 3 มากำหนดค่าเพื่อให้สามารถพับครึ่งจอในแนวนอนได้

// Pixel 3
hw.sensor.hinge = yes
hw.sensor.hinge.count = 1
hw.sensor.hinge.type = 0
hw.sensor.hinge.ranges = 0-180
hw.sensor.hinge.defaults = 180
hw.sensor.hinge.areas = 0-1080-1080-1
hw.sensor.posture_list = 1,2,3
hw.sensor.hinge_angles_posture_definitions = 0-30,30-150,150-180

โดยจะมี Posture อยู่ทั้งหมด 3 แบบด้วยกันคือ Closed, Half-open และ Open

ลองกำหนดค่าตามแล้ว แต่แสดงผลไม่ถูกต้อง?

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

อยากลองกำหนด Configuration เอง?

ถ้าอยากรู้ว่าใน config.ini สามารถกำหนดค่าอะไรได้บ้าง สามารถเข้าไปดูได้ที่ hardware-properties.ini - Git at Google

linux-x86_64/lib/hardware-properties.ini - platform/prebuilts/android-emulator - Git at Google

จากนั้นก็กำหนดค่าต่างๆตามใจชอบได้เลย ระวังกำหนดค่าผิดแล้วหน้าจอแสดงผลเพี้ยนล่ะ