สำหรับอุปกรณ์แบบพับได้ คุณสามารถเพิ่มประสิทธิภาพประสบการณ์ของผู้ใช้ได้โดยการปรับลักษณะการหมุนหน้าจอให้สอดคล้องกับสถานะทางกายภาพของอุปกรณ์ เช่น คุณสามารถตั้งค่าให้ หน้าจอหมุนโดยอัตโนมัติเมื่อกางอุปกรณ์ในท่าทางคล้ายแท็บเล็ต แต่ล็อกเป็นแนวตั้งเมื่อพับอุปกรณ์
ตั้งแต่ Android 13 เป็นต้นไป Android จะมีความสามารถในการ ปรับแต่งการตั้งค่าหมุนอัตโนมัติตามสถานะของอุปกรณ์ เช่น พับ กางออก หรือพับครึ่ง (โหมดตั้งโต๊ะ)
รูปที่ 1: การตั้งค่าหมุนอัตโนมัติโดยอิงตามสถานะของอุปกรณ์ตามที่ผู้ใช้เห็น
เปิดใช้การตั้งค่าหมุนอัตโนมัติตามสถานะอุปกรณ์
หากต้องการเปิดใช้และกำหนดค่าการหมุนอัตโนมัติโดยอิงตามสถานะอุปกรณ์ ให้สร้าง
การวางซ้อนอุปกรณ์สำหรับไฟล์ config.xml ของเฟรมเวิร์ก ดังนี้
กำหนดค่าลักษณะการทำงานของการหมุนอัตโนมัติเริ่มต้นสำหรับท่าทางของอุปกรณ์ต่างๆ โดย ป้อนข้อมูลอาร์เรย์จำนวนเต็ม
config_perDeviceStateRotationLockDefaultsในการวางซ้อนconfig.xmlของอุปกรณ์<!-- In your device overlay, for example, device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml --> <resources> <!-- Map of device posture to rotation lock setting. Each entry must be in the format "key:value", or "key:value:fallback_key" for example: "0:1" or "2:0:1". The keys are one of Settings.Secure.DeviceStateRotationLockKey, and the values are one of Settings.Secure.DeviceStateRotationLockSetting. --> <integer-array name="config_perDeviceStateRotationLockDefaults"> <item>0:1</item> <!-- CLOSED -> LOCKED --> <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to device posture OPENED --> <item>2:2</item> <!-- OPENED -> UNLOCKED --> <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to device posture CLOSED --> </integer-array> </resources>fallback-keyเป็นการอ้างอิงถึงท่าทางของอุปกรณ์อื่น และคุณต้องระบุ เมื่อค่าสำหรับท่าทางเป็นSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNOREDเมื่อกำหนดค่าท่าทางในลักษณะนี้ ระบบจะเปลี่ยนเส้นทางคำขอรับหรือตั้งค่ากำหนดการหมุนอัตโนมัติของท่าทางนั้นไปยังท่าทางสำรองเช่น หากท่าทาง
HALF_OPENEDเปลี่ยนกลับเป็นท่าทางOPENED- การอ่านการตั้งค่าการหมุนอัตโนมัติสำหรับ
HALF_OPENEDจะแสดงการตั้งค่าปัจจุบันสำหรับOPENED - การเขียนค่ากำหนดการหมุนอัตโนมัติใหม่ขณะที่อุปกรณ์
HALF_OPENEDอัปเดต ค่ากำหนดสำหรับท่าทางOPENED
- การอ่านการตั้งค่าการหมุนอัตโนมัติสำหรับ
กำหนดค่าคำอธิบายสำหรับท่าทางของอุปกรณ์แต่ละท่าทางที่ผู้ใช้ตั้งค่าได้ ป้อน
config_settableAutoRotationDeviceStatesDescriptionsอาร์เรย์สตริงในการซ้อนทับแอปการตั้งค่าของอุปกรณ์<!-- In your device's Settings app overlay --> <resources> <!-- The settings/preference description for each settable device posture defined in the array "config_perDeviceStateRotationLockDefaults". The item in position "i" describes the auto-rotation setting for the device posture also in position "i" in the array "config_perDeviceStateRotationLockDefaults". --> <string-array name="config_settableAutoRotationDeviceStatesDescriptions"> <item>Auto-rotate when folded</item> <item>@null</item> <!-- No description for state in position 1 (it is not settable by the user) --> <item>Auto-rotate when unfolded</item> </string-array> </resources>คุณต้องใช้ API ที่ถูกต้องเพื่อแก้ไขการตั้งค่าเหล่านี้โดยอัตโนมัติ แทนที่จะเขียนไปยังผู้ให้บริการการตั้งค่าโดยตรง เพื่อป้องกัน ลักษณะการทำงานที่ไม่สอดคล้องกัน
วิธีเปลี่ยนสถานะการล็อกการหมุนปัจจุบัน (แก้ไข
ACCELEROMETER_ROTATION)- จาก SystemUI หรือ Launcher ให้ใช้
RotationPolicy#setRotationLock(...) - จากตัวจัดการหน้าต่าง ให้ใช้
DisplayRotation#freezeRotation()หรือthawRotation()
- จาก SystemUI หรือ Launcher ให้ใช้
วิธีเปลี่ยนค่ากำหนดการล็อกการหมุนสำหรับสถานะอุปกรณ์ที่เฉพาะเจาะจง (แก้ไข
DEVICE_STATE_ROTATION_LOCK):- ใช้
requestDeviceStateAutoRotateSettingChange(...)จากRotationPolicyหรือDeviceStateAutoRotateSettingManager
- ใช้
รายละเอียดการติดตั้งใช้งาน
การตั้งค่าและคลาสคีย์หลักที่ควบคุมลักษณะการหมุนอัตโนมัติสำหรับ อุปกรณ์แบบพับได้อธิบายไว้ในส่วนต่อไปนี้
การตั้งค่า
ระบบใช้การตั้งค่า 2 อย่างต่อไปนี้เพื่อจัดการการหมุนอัตโนมัติ
Settings.System.ACCELEROMETER_ROTATION: นี่คือการตั้งค่าการหมุนอัตโนมัติหลัก สำหรับอุปกรณ์แบบพับได้ ค่าจะแสดงว่ามีการเปิดใช้ หมุนอัตโนมัติสำหรับท่าทางปัจจุบันของอุปกรณ์หรือไม่Settings.Secure.DEVICE_STATE_ROTATION_LOCK: การตั้งค่านี้จะจัดเก็บค่ากำหนดการหมุนอัตโนมัติของ ผู้ใช้สำหรับท่าทางของอุปกรณ์แต่ละท่า (เช่น พับ หรือไม่พับ) ซึ่งจะช่วยให้ระบบใช้ค่ากำหนดที่ถูกต้องเมื่อ ท่าทางของอุปกรณ์เปลี่ยนแปลงระบบจะจัดเก็บการตั้งค่าเป็นสตริงที่คั่นด้วยเครื่องหมายโคลอน ค่าแต่ละคู่ แสดงถึงท่าทางของอุปกรณ์และการตั้งค่าการหมุนที่สอดคล้องกัน รูปแบบคือ
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...ค่าสำหรับการหมุนมีดังนี้
0: ไม่สนใจ (ใช้การตั้งค่าสำหรับท่าทางสำรอง)1: ล็อกอยู่ (ปิดการหมุนอัตโนมัติ)2: ปลดล็อก (เปิดการหมุนอัตโนมัติ)
เช่น สตริง
"0:2:2:1"หมายถึง- สำหรับสถานะพับ (ท่าทาง
0) การหมุนอัตโนมัติจะปลดล็อก (2) - สำหรับสถานะที่กางออก (ท่าทาง
2) การหมุนอัตโนมัติจะล็อก (1)
คลาสที่สำคัญ
ตรรกะสำหรับการจัดการการตั้งค่าการหมุนอัตโนมัติที่อิงตามสถานะอุปกรณ์จะได้รับการจัดการโดยคลาสต่อไปนี้
DeviceStateAutoRotateSettingManagerImpl: จัดการการตั้งค่าDEVICE_STATE_ROTATION_LOCKโดยมีวิธีการอัปเดต การตั้งค่า ดึงค่า และลงทะเบียน Listener สำหรับการเปลี่ยนแปลงDeviceStateAutoRotateSettingController(Window Manager): ซิงค์ACCELEROMETER_ROTATIONและDEVICE_STATE_ROTATION_LOCKเมื่อ ท่าทางของอุปกรณ์เปลี่ยนไป ระบบจะอัปเดตACCELEROMETER_ROTATIONตาม ค่ากำหนดของผู้ใช้สำหรับสถานะใหม่ ซึ่งจะช่วยให้มั่นใจได้ว่าการเปลี่ยนแปลงใดๆ ในACCELEROMETER_ROTATIONจะได้รับการบันทึกกลับไปยังDEVICE_STATE_ROTATION_LOCKสำหรับ ท่าทางของอุปกรณ์ปัจจุบัน และในทำนองเดียวกัน การเปลี่ยนแปลงในDEVICE_STATE_ROTATION_LOCKสำหรับท่าทางปัจจุบันจะแสดงในACCELEROMETER_ROTATIONDeviceStateAutoRotateSettingController(แอปการตั้งค่า): ควบคุม UI ในหน้าการตั้งค่าการหมุนอัตโนมัติโดยอิงตามสถานะของอุปกรณ์PostureDeviceStateConverter: แปลงระหว่างตัวระบุสถานะอุปกรณ์ทั่วไปกับตัวระบุท่าทางของอุปกรณ์ที่ฟีเจอร์นี้ใช้
การตรวจสอบความถูกต้อง
เนื่องจากลักษณะการทำงานของฟีเจอร์นี้ขึ้นอยู่กับการกำหนดค่าของ OEM เป็นอย่างมาก จึงไม่มีการทดสอบ CTS เฉพาะสำหรับฟีเจอร์นี้ คุณต้องทำการทดสอบด้วยตนเองเพื่อ ยืนยันว่าการตั้งค่าหมุนอัตโนมัติเปลี่ยนตามที่คาดไว้เมื่ออุปกรณ์ เปลี่ยนสถานะทางกายภาพต่างๆ ที่คุณกำหนดค่าไว้