หมุนข้อเสนอแนะ

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

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

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

GIF นี้แสดงโทรศัพท์ในแนวนอนพร้อมกับหน้าจอในแนวตั้ง ไอคอนจะปรากฏขึ้นเพื่อถามผู้ใช้ว่าต้องการเปลี่ยนการวางแนวหน้าจอเป็นแนวนอนหรือไม่
รูปที่ 1 . หมุนปุ่มคำแนะนำโดยเปิดใช้งานท่าทางสัมผัส "ปัดขึ้นบนปุ่มโฮม"

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

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

แหล่งที่มา

เพิ่มการรองรับคำแนะนำการหมุนใน Android 9 แล้ว การเปลี่ยนแปลงส่วนใหญ่อยู่ในไฟล์ต่อไปนี้

  • services/.../server/policy/PhoneWindowManager.java :
    • Hooks ที่ใช้เอาต์พุตของ WindowOrientationListener ( MyOrientationListener รับผิดชอบในการตรวจสอบเซ็นเซอร์เพื่อตรวจสอบว่าอุปกรณ์ถูกหมุนหรือไม่)
    • ช่วยให้ WindowOrientationListener ทำงานแม้ว่าจะปิดใช้งานการหมุนอัตโนมัติ (ดู needSensorRunningLp() )
    • คำนวณการหมุนของระบบตามการตั้งค่าการหมุนของผู้ใช้ การตั้งค่า screenOrientation จอกิจกรรมด้านบน และสถานะของระบบ (ดูที่ rotationForOrientationLw() )
    • ตรวจสอบว่ากิจกรรมบนสุดสามารถหมุนไปตามการหมุนที่กำหนดได้หรือไม่ (ดู isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • กำหนดว่าควรแสดงปุ่ม navbar ในการเรียกกลับคำแนะนำการหมุนจาก PhoneWindowManager หรือไม่ (ดู onRotationProposal() )
    • จัดการเวลาที่จะซ่อนปุ่มหมุน navbar (ดูการเรียกไปยัง setRotateSuggestionButtonState(false) )
    • จัดการการหมดเวลาของปุ่ม รวมถึงกรณีพิเศษเมื่อแถบนำทางถูกซ่อน (โดยทั่วไปจะแสดงแบบเต็มหน้าจอ)
    • รีเซ็ตการตั้งค่าผู้ใช้เมื่อกลับสู่การวางแนวตามธรรมชาติของอุปกรณ์ ( mRotationWatcher )
    • เลือกสไตล์ที่เหมาะสมสำหรับภาพเคลื่อนไหวของปุ่มแถบนำทางที่ใช้ใน NavigationBarView (ดูที่ onRotationProposal() )
    • เพิ่มตรรกะของโหมดการแนะนำ รวมถึงภาพเคลื่อนไหวพิเศษ (ดูการอ้างอิงถึง Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • ใช้การตั้งค่าสถานะการหมุนของ Disable2 (ดูที่ disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • ภาพเคลื่อนไหวไอคอนปุ่มสไตล์เพื่อให้ตรงกับการหมุนที่รอดำเนินการ (ดู updateRotateSuggestionButtonStyle() )
    • จัดการการเปลี่ยนแปลงการมองเห็นปุ่ม (ดู setRotateButtonVisibility() ) รวมถึงตรรกะในการซ่อนปุ่มหมุนหากบริการการเข้าถึงบางอย่างทำงานอยู่ (คำนึงถึงการจัดอันดับสแต็กปุ่ม navbar ขวาสุด)
  • SystemUI/res/layout/menu_ime.xml :
    • รวม KeyButtonView ใหม่สำหรับปุ่มหมุน ซึ่งซ้อนกันอยู่เหนือเมนูและตัวเลือก IME/แป้นพิมพ์ แต่อยู่ใต้ปุ่มการเข้าถึง
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Complex AnimatedVectorDrawable ใช้เพื่อทำให้ปุ่มหมุนแถบนำทางเคลื่อนไหว
    • การจัดสไตล์ (ใน SystemUI/res/values/styles.xml ) ใช้เพื่อตั้งค่ามุมเริ่มต้นและสิ้นสุดของการหมุน ดังนั้นจึงสามารถใช้ Drawable เดียวกันเพื่อสร้างภาพเคลื่อนไหวการหมุนเริ่มต้นและสิ้นสุดต่างๆ
    • การย้อมสีไอคอนถูกตั้งค่าผ่าน TintedKeyButtonDrawable

การนำไปปฏิบัติ

Android 9 มีการเปลี่ยนแปลงที่จำเป็นทั้งหมดเพื่อรับคำแนะนำการหมุนที่ทำงานบนอุปกรณ์ที่ใช้ปุ่มนำทางซอฟต์แวร์ (ด้านหลัง บ้าน ฯลฯ)

ผู้ผลิตอุปกรณ์ที่สร้างอุปกรณ์ด้วยปุ่มนำทางฮาร์ดแวร์ที่ต้องการใช้คุณสมบัตินี้จะต้องออกแบบและใช้งาน System UI ของตนเองหรือปิดใช้งานคุณสมบัตินี้ ขอแนะนำให้พื้นผิวที่แนะนำใดๆ ก็ตามใช้งานง่ายเมื่อถืออุปกรณ์ไว้ที่ 90° หรือ 180° ตามการหมุนของระบบปัจจุบัน และสามารถเข้าถึงได้อย่างรวดเร็ว ด้วยเหตุผลเหล่านี้ จึงไม่แนะนำให้ใช้การแจ้งเตือน (เช่นเดียวกับที่ทำกับตัวเลือก IME/แป้นพิมพ์)

ข้อกำหนดด้านฮาร์ดแวร์เพื่อใช้คุณลักษณะนี้เหมือนกับข้อกำหนดในการใช้การหมุนอัตโนมัติ

จำเป็นสำหรับความสอดคล้องในการใช้งานที่การตั้งค่าการหมุนของผู้ใช้ ( Settings.System.USER_ROTATION ) จะถูกรีเซ็ตเป็นการหมุนตามธรรมชาติของอุปกรณ์ เมื่อระบบเปลี่ยนเป็นการหมุนตามธรรมชาติของอุปกรณ์ไม่ว่าด้วยเหตุผลใดก็ตามเมื่อปิดการหมุนอัตโนมัติ การใช้งานที่ให้มาจะทำสิ่งนี้ (ดู NavigationBarFragment.mRotationWatcher )

มีการตั้งค่าสถานะใหม่ใน StatusBarManager.disable2 เพื่อป้องกันไม่ให้คำแนะนำในการหมุนปรากฏขึ้นชั่วคราว ดู StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS แฟล็กนี้ต้องได้รับการเคารพในการใช้งานทั้งหมด เนื่องจากถูกใช้โดยแอประบบที่สำคัญ รวมถึงวิซาร์ดการตั้งค่า การใช้งานที่ให้มารองรับสิ่งนี้ (ดู NavigationBarFragment.disable() )

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

การปรับแต่ง

เนื่องจากคำแนะนำในการหมุนจะปรากฏเฉพาะในโหมดล็อคการหมุนเท่านั้น (ปิดการหมุนอัตโนมัติ) คุณจึงสามารถเลือกได้ว่าจะเปิดคุณสมบัตินี้เป็นค่าเริ่มต้นสำหรับการติดตั้งใหม่หรือไม่ โดยเลือกที่จะปิดการหมุนอัตโนมัติตามค่าเริ่มต้น ดู def_accelerometer_rotation ใน SettingsProvider/res/values/defaults.xml เพื่อทำการเปลี่ยนแปลงเริ่มต้น

ผู้ใช้สามารถเปลี่ยนได้อย่างง่ายดายว่าการหมุนอัตโนมัติทำงานอยู่หรือไม่ (โดยไม่คำนึงถึงค่าเริ่มต้น) ผ่านทางไทล์หมุนในการตั้งค่าด่วนหรือการตั้งค่าการแสดงผล

การตรวจสอบ

สำหรับการทดสอบ คุณลักษณะนี้สามารถปิดและเปิดได้โดยการเปลี่ยน 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