คำแนะนำในการหมุน

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

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

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

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

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