ใน Android 8.0 ผู้ใช้สามารถสลับระหว่างโหมดหมุนอัตโนมัติกับโหมดหมุนแนวตั้งได้โดยใช้การ์ดการตั้งค่าด่วนหรือการตั้งค่าการแสดงผล ใน Android 9 เราได้อัปเดตโหมดการหมุนแนวตั้งเพื่อกำจัดการหมุนโดยไม่ตั้งใจด้วยการปักหมุดการหมุนหน้าจอปัจจุบันไว้ แม้ว่าตำแหน่งของอุปกรณ์จะเปลี่ยนไปก็ตาม ผู้ใช้สามารถเรียกใช้การหมุนด้วยตนเองได้เมื่อจำเป็นโดยกดปุ่มใหม่ในแถบนําทาง เราได้เปลี่ยนชื่อโหมดแนวตั้งเป็น "ล็อกการหมุน" ซึ่งจะเปิดใช้งานเมื่อการหมุนอัตโนมัติปิดอยู่ จะไม่มีการเปลี่ยนแปลงโหมดการหมุนอัตโนมัติ
เมื่ออุปกรณ์อยู่ในโหมดล็อกการหมุน ผู้ใช้จะล็อกหน้าจอให้อยู่ในการหมุนใดก็ได้ที่กิจกรรมที่มองเห็นได้ที่ด้านบนรองรับ (ตามข้อจำกัดของระบบปัจจุบัน) หากกิจกรรมยอดนิยมแสดงผลได้หลายรูปแบบในการหมุนในโหมดหมุนอัตโนมัติ ตัวเลือกเดียวกันนี้ควรมีให้ใช้งานในโหมดล็อกการหมุน โดยมีข้อยกเว้นบางประการตามscreenOrientation
การตั้งค่าของกิจกรรม
โหมดล็อกการหมุนจะทำงานโดยแสดงปุ่มในแถบนำทางเมื่อมีการเปลี่ยนแปลงการหมุนของอุปกรณ์ เซ็นเซอร์การวางแนวของอุปกรณ์ต้องทำงานอยู่เสมอแม้ว่าจะปิดการหมุนอัตโนมัติไว้ก็ตาม การแตะปุ่มนี้จะตั้งค่าการหมุนของผู้ใช้ (Settings.System.USER_ROTATION
) อย่างมีประสิทธิภาพ WindowManager จะใช้ค่ากำหนดนี้ร่วมกับรายละเอียดอื่นๆ เกี่ยวกับกิจกรรมและสถานะระบบด้านบนเพื่อเปลี่ยนการหมุนของระบบ WindowManager จะใช้ค่ากําหนดการหมุนของผู้ใช้ต่อไปเมื่อตัดสินใจว่าจะแสดงผลระบบในการหมุนแบบใดเมื่อเปลี่ยนไปใช้กิจกรรมอื่น

ควรรักษาค่ากำหนดการเปลี่ยนผู้ใช้เมื่อสลับไปมาระหว่างกิจกรรม อย่างไรก็ตาม เนื่องจากผู้ใช้โทรศัพท์ส่วนใหญ่ต้องการใช้โหมดแนวนอนเป็นระยะเวลาสั้นๆ เท่านั้น เราจึงเพิ่มการเอียงตามแนวนอนโดยธรรมชาติ ระบบจะรีเซ็ตค่ากำหนดการหมุนของผู้ใช้เป็นการวางแนวตามปกติของอุปกรณ์ทุกครั้งที่การหมุนของระบบเปลี่ยนเป็นการวางแนวตามปกติของอุปกรณ์ สำหรับโทรศัพท์ส่วนใหญ่ การวางแนวธรรมชาติของอุปกรณ์คือแนวตั้ง (0º) การตั้งค่าการหมุนของผู้ใช้ใหม่มักเกิดขึ้นเมื่อใช้แอปแนวตั้งเท่านั้น ล็อกโทรศัพท์ หรือกลับไปยังพื้นที่ทํางานของ Launcher
การโต้ตอบแบบหมุนเวียนสําหรับผู้ใช้ไม่ได้เปลี่ยนแปลงไปมากนักในช่วง 10 ปีที่ผ่านมา ผู้ใช้อาจพบว่าฟีเจอร์นี้ค้นพบได้ยากเนื่องจากเคยชินกับการหมุนและการวางปุ่มในแถบนําทาง ด้วยเหตุนี้ เราจึงเพิ่มโหมดแนะนำลงในปุ่มหมุนที่จะไฮไลต์ปุ่มเมื่อปรากฏขึ้น ลักษณะการทํางานของโหมดแนะนำจะเกิดขึ้นกับการโต้ตอบกับปุ่ม 2-3 ครั้งแรกเท่านั้น หลังจากนั้นระบบจะปิดใช้โหมดแนะนำ
แหล่งที่มา
เพิ่มการรองรับคำแนะนำการหมุนใน Android 9 แล้ว การเปลี่ยนแปลงส่วนใหญ่อยู่ในไฟล์ต่อไปนี้
services/.../server/policy/PhoneWindowManager.java
:- ฮุกที่ใช้เอาต์พุตของ
WindowOrientationListener
(MyOrientationListener
ซึ่งมีหน้าที่ตรวจสอบเซ็นเซอร์เพื่อระบุว่ามีการหมุนอุปกรณ์หรือไม่) - ช่วยให้
WindowOrientationListener
ทำงานอยู่เสมอแม้ว่าจะปิดใช้การหมุนอัตโนมัติ (ดูneedSensorRunningLp()
) - คํานวณการหมุนเวียนของระบบตามค่ากําหนดการหมุนเวียนของผู้ใช้ การตั้งค่า
screenOrientation
กิจกรรมยอดนิยม และสถานะของระบบ (ดูrotationForOrientationLw()
) - ระบุว่ากิจกรรมยอดนิยมสามารถหมุนเป็นการหมุนที่กำหนดได้หรือไม่ (ดู
isRotationChoicePossible()
)
- ฮุกที่ใช้เอาต์พุตของ
SystemUI/.../statusbar/phone/NavigationBarFragment
:- กำหนดว่าควรแสดงปุ่มแถบนําทางเมื่อหมุนหรือไม่ callbacks คำแนะนำจาก
PhoneWindowManager
(ดูonRotationProposal()
) - จัดการกรณีที่ควรซ่อนปุ่มแถบนําทางแบบหมุน (ดูการเรียกใช้
setRotateSuggestionButtonState(false)
) - จัดการการหมดเวลาของปุ่ม รวมถึงกรณีพิเศษเมื่อแถบนําทางซ่อนอยู่ (มักเป็นในโหมดเต็มหน้าจอ)
- รีเซ็ตค่ากําหนดของผู้ใช้เมื่อกลับไปยังการวางแนวปกติของอุปกรณ์ (
mRotationWatcher
) - เลือกสไตล์ที่เหมาะสมสำหรับภาพเคลื่อนไหวของปุ่มแถบนําทางที่ใช้ใน
NavigationBarView
(ดูonRotationProposal()
) - เพิ่มตรรกะโหมดแนะนำ รวมถึงภาพเคลื่อนไหวเฉพาะ (ดูการอ้างอิงถึง
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
) - ใช้การตั้งค่าสถานะการหมุน disable2 (ดู
disable()
)
- กำหนดว่าควรแสดงปุ่มแถบนําทางเมื่อหมุนหรือไม่ callbacks คำแนะนำจาก
SystemUI/.../statusbar/phone/NavigationBarView.java
:- ภาพเคลื่อนไหวของไอคอนปุ่มสไตล์ให้ตรงกับการหมุนที่รอดำเนินการ (ดู
updateRotateSuggestionButtonStyle()
) - จัดการการเปลี่ยนแปลงการแสดงผลของปุ่ม (ดู
setRotateButtonVisibility()
) รวมถึงตรรกะในการซ่อนปุ่มหมุนหากบริการการช่วยเหลือพิเศษบางอย่างทำงานอยู่ (พิจารณาการจัดอันดับกองปุ่มแถบนําทางด้านขวาสุด)
- ภาพเคลื่อนไหวของไอคอนปุ่มสไตล์ให้ตรงกับการหมุนที่รอดำเนินการ (ดู
SystemUI/res/layout/menu_ime.xml
:- มี
KeyButtonView
ใหม่สำหรับปุ่มหมุน ซึ่งวางซ้อนอยู่เหนือเมนูและเครื่องมือเลือก IME/แป้นพิมพ์ แต่อยู่ใต้ปุ่มการช่วยเหลือพิเศษ
- มี
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:AnimatedVectorDrawable
แบบซับซ้อนที่ใช้สร้างภาพเคลื่อนไหวของปุ่มแถบนําทางแบบหมุน- การจัดสไตล์ (ใน
SystemUI/res/values/styles.xml
) ใช้เพื่อกำหนดมุมเริ่มต้นและมุมสิ้นสุดของการหมุนเพื่อให้ใช้รูปภาพที่วาดได้เดียวกันเพื่อสร้างภาพเคลื่อนไหวของการหมุนเริ่มต้นและสิ้นสุดแบบต่างๆ ได้ - การตั้งค่าสีไอคอนทำได้ผ่าน
TintedKeyButtonDrawable
การใช้งาน
Android 9 มีการเปลี่ยนแปลงที่จำเป็นทั้งหมดเพื่อให้คำแนะนำการหมุนใช้งานได้สำหรับอุปกรณ์ที่ใช้ปุ่มการไปยังส่วนต่างๆ ของซอฟต์แวร์ (ย้อนกลับ หน้าแรก ฯลฯ)
ผู้ผลิตอุปกรณ์ที่สร้างอุปกรณ์ที่มีปุ่มการไปยังส่วนต่างๆ ของฮาร์ดแวร์ที่ต้องการใช้ฟีเจอร์นี้จะต้องออกแบบและติดตั้งใช้งานการช่วยเหลือของ UI ระบบของตนเอง หรือปิดใช้ฟีเจอร์ เราขอแนะนำให้พื้นผิวที่นำเสนอใช้งานง่ายเมื่อถืออุปกรณ์ในแนวตั้ง 90º หรือ 180º กับการหมุนของอุปกรณ์ปัจจุบัน และเข้าถึงได้อย่างรวดเร็ว ด้วยเหตุนี้ เราจึงไม่แนะนำให้ใช้การแจ้งเตือน (เช่นเดียวกับที่ใช้กับเครื่องมือเลือก IME/แป้นพิมพ์)
ข้อกำหนดด้านฮาร์ดแวร์ในการใช้ฟีเจอร์นี้เหมือนกับข้อกำหนดในการใช้การหมุนอัตโนมัติ
การตั้งค่าการหมุนของผู้ใช้ (Settings.System.USER_ROTATION
) ต้องรีเซ็ตเป็นการหมุนตามปกติของอุปกรณ์เมื่อระบบเปลี่ยนเป็นการหมุนตามปกติของอุปกรณ์ไม่ว่าด้วยเหตุผลใดก็ตามเมื่อการหมุนอัตโนมัติปิดอยู่ การใช้งานที่ระบุไว้จะทำเช่นนี้ (ดูNavigationBarFragment.mRotationWatcher
) เพื่อให้การใช้งานมีความสอดคล้องกัน
มีการตั้งค่าใหม่ใน StatusBarManager.disable2
เพื่อป้องกันไม่ให้คำแนะนำในการหมุนปรากฏขึ้นชั่วคราว โปรดดูStatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
ต้องคำนึงถึง Flag นี้ในทุกการใช้งาน เนื่องจากแอประบบที่สำคัญรวมถึงวิซาร์ดการตั้งค่าใช้ Flag นี้ การติดตั้งใช้งานที่ระบุรองรับการดำเนินการนี้ (ดู
NavigationBarFragment.disable()
)
เราขอแนะนําอย่างยิ่งให้เปิดใช้ฟีเจอร์นี้และทําตามการติดตั้งใช้งาน AOSP หากเป็นไปได้ เรามุ่งมั่นที่จะคงประสบการณ์การหมุนให้คล้ายกันระหว่างอุปกรณ์ต่างๆ เพื่อสะท้อนประสบการณ์การใช้งานที่เหมือนกันระหว่างการหมุนอัตโนมัติและการล็อกแนวตั้งในโทรศัพท์ส่วนใหญ่ในปัจจุบัน
การปรับแต่ง
เนื่องจากคำแนะนำการหมุนจะปรากฏในโหมดการหมุนที่ล็อกไว้เท่านั้น (การหมุนอัตโนมัติปิดอยู่) คุณจึงเลือกได้ว่าจะเปิดฟีเจอร์นี้ไว้โดยค่าเริ่มต้นสำหรับการติดตั้งใหม่หรือไม่โดยเลือกให้ปิดการหมุนอัตโนมัติไว้โดยค่าเริ่มต้น ดู
def_accelerometer_rotation
ใน
SettingsProvider/res/values/defaults.xml
เพื่อทำการเปลี่ยนแปลงเริ่มต้น
ผู้ใช้สามารถเปลี่ยนการตั้งค่าการหมุนอัตโนมัติได้ง่ายๆ (ไม่ว่าจะตั้งค่าเป็นค่าเริ่มต้นหรือไม่) ผ่านการ์ดการหมุนในการตั้งค่าด่วนหรือการตั้งค่าการแสดงผล
การตรวจสอบความถูกต้อง
สำหรับการทดสอบ คุณสามารถปิดและเปิดฟีเจอร์ได้โดยการเปลี่ยนค่า gating
Settings.Secure
ซึ่งทำได้ง่ายๆ โดยเรียกใช้คำสั่งต่อไปนี้จากอินสแตนซ์ adb ที่มีสิทธิ์
adb shell settings put secure show_rotation_suggestions <x>
ตั้งค่า x เป็น 0
สำหรับปิดและ 1
สำหรับเปิด
สําหรับการทดสอบ คุณสามารถรีเซ็ตโหมดแนะนําได้โดยการเปลี่ยนค่า Settings.Secure
ที่เชื่อมโยง ซึ่งทำได้ง่ายๆ โดยเรียกใช้คำสั่งต่อไปนี้จากอินสแตนซ์ adb ที่มีสิทธิ์
adb shell settings put secure num_rotation_suggestions_accepted 0