สำหรับอุปกรณ์พับได้ คุณสามารถเพิ่มประสิทธิภาพประสบการณ์การใช้งานของผู้ใช้ได้ด้วยการปรับลักษณะการทำงานของการหมุนหน้าจอให้เข้ากับสถานะทางกายภาพของอุปกรณ์ เช่น คุณสามารถตั้งค่าให้หน้าจอหมุนโดยอัตโนมัติเมื่อกางอุปกรณ์ออกในท่าทางคล้ายแท็บเล็ต แต่ล็อกให้อยู่ในแนวตั้งเมื่อพับอุปกรณ์
ตั้งแต่ 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(...) - จาก Window Manager ให้ใช้
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: แปลงระหว่างตัวระบุสถานะอุปกรณ์ทั่วไปกับตัวระบุท่าทางของอุปกรณ์ที่ฟีเจอร์นี้ใช้
การตรวจสอบ
เนื่องจากลักษณะการทำงานของฟีเจอร์นี้ขึ้นอยู่กับการกำหนดค่าของผู้ผลิตอุปกรณ์เป็นอย่างมาก จึงไม่มีการทดสอบ CTS ที่เฉพาะเจาะจงสำหรับฟีเจอร์นี้ คุณต้องทำการทดสอบด้วยตนเองเพื่อยืนยันว่าการตั้งค่าการหมุนอัตโนมัติเปลี่ยนแปลงตามที่คาดไว้เมื่ออุปกรณ์เปลี่ยนระหว่างสถานะทางกายภาพต่างๆ ที่คุณกำหนดค่าไว้