การจัดการหน้าต่าง

ChromeOS รองรับแอป Android ในหลายหน้าต่าง ระบบแสดงผลแอป ลงในคอนเทนเนอร์หน้าต่างซึ่งมีขนาดที่กำหนดโดยรูปแบบของอุปกรณ์ อุปกรณ์ ดังที่แสดงในรูปที่ 1

รูปที่ 1 หน้าต่างแอปในอุปกรณ์ต่างๆ

การออกแบบเลย์เอาต์ที่ทำงานร่วมกับหน้าจอขนาดต่างๆ เป็นสิ่งสำคัญ หากคุณ ปฏิบัติตามหลักเกณฑ์ของ Android เพื่อสนับสนุนหน้าจอแบบต่างๆ ขนาดต่างๆ ก็ทำให้แอปทำงานได้ดี เมื่อทำงานบน ChromeOS

หน้านี้จะแสดงวิธีตรวจสอบว่าหน้าต่างของแอปเปิดอย่างถูกต้อง ปรับขนาด อย่างราบรื่น และแสดงเนื้อหาทั้งหมดเมื่อมีการเปลี่ยนแปลงขนาด

ขนาดการเปิดตัวครั้งแรก

แอปขอขนาดการเปิดเริ่มต้นได้ด้วยวิธีต่อไปนี้

  • ใช้ขนาดการเปิดตัวในสภาพแวดล้อมเดสก์ท็อปเท่านั้น ซึ่งจะช่วยให้ผู้จัดการหน้าต่างสามารถบอกขอบเขตที่เหมาะสมและ การวางแนว หากต้องการระบุค่ากำหนดเมื่อใช้ในโหมดเดสก์ท็อป ให้เพิ่ม เมตาแท็กต่อไปนี้ภายในแท็ก <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • ใช้ขอบเขตการเปิดตัวแบบคงที่ ใช้ <layout> ในรายการไฟล์ Manifest ที่จะระบุกิจกรรม "คงที่" ขนาดเริ่มต้น ดังตัวอย่างต่อไปนี้
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • ใช้ขอบเขตการเปิดตัวแบบไดนามิก กิจกรรมสามารถสร้างและใช้ ActivityOptions.setLaunchBounds(Rect) เมื่อสร้างกิจกรรมใหม่ โดย ระบุสี่เหลี่ยมว่างเปล่า แอปของคุณจะขยายใหญ่สุดได้

ปรับขนาดหน้าต่าง

ใน ChromeOS ผู้ใช้จะปรับขนาดหน้าต่างของแอปด้วยวิธีปกติได้ด้วยการลาก มุมขวาล่างดังที่แสดงในรูปที่ 2

รูปที่ 2 หน้าต่างแอปที่ปรับขนาดได้

มี 2 ตัวเลือกสำหรับจัดการการปรับขนาดหน้าต่างเมื่อใช้ View ชั้นเรียน:

  • ตอบสนองต่อการเปลี่ยนแปลงการกําหนดค่าแบบไดนามิกด้วยการเรียกใช้ onConfigurationChanged(..) ตัวอย่างเช่น คุณสามารถเพิ่ม android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" ในไฟล์ Manifest ของกิจกรรม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการการเปลี่ยนแปลงการกำหนดค่า โปรดอ่าน การจัดการการเปลี่ยนแปลงการกำหนดค่า
  • ปล่อยให้ระบบรีสตาร์ทกิจกรรม ในกรณีนี้ ให้ใช้ onSaveInstanceStateและใช้สถาปัตยกรรม ViewModel คอมโพเนนต์เพื่อคืนค่า สถานะที่บันทึกไว้

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

ขนาดของกรอบเวลา

ให้กิจกรรมอ่านมิติข้อมูลของกรอบเวลาทุกครั้งที่เริ่มต้น และ จัดเรียงเนื้อหาตามการกำหนดค่าปัจจุบัน

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

โปรดทราบว่าขนาดหน้าต่างและหน้าจอไม่เหมือนกัน หากต้องการดาวน์โหลด ขนาดหน้าต่างใน DP ให้ใช้ Activity.getResources().getConfiguration().screenWidth และ Activity.getResources().getConfiguration().screenHeight คุณอาจ ไม่จำเป็นต้องใช้ขนาดหน้าจอ

ขอบเขตของเนื้อหา

ขอบเขตของเนื้อหาของหน้าต่างอาจเปลี่ยนแปลงได้หลังจากปรับขนาด ตัวอย่างเช่น พื้นที่ภายใน หน้าต่างที่แอปใช้อาจเปลี่ยนแปลงได้หากหน้าต่างมีขนาดใหญ่เกินไป ให้พอดีกับหน้าจอ โดยทำตามหลักเกณฑ์ต่อไปนี้

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

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    การตรวจสอบอย่างต่อเนื่องสามารถทำได้โดยใช้เครื่องมือสังเกตการณ์

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • เพิ่ม Listener ใน view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    หากแอปกำลังปรับขนาดอาร์ตเวิร์กล่วงหน้า ให้ทำทุกครั้งที่ความละเอียดมีการเปลี่ยนแปลง

การปรับขนาดรูปแบบอิสระ

ChromeOS ช่วยให้ปรับขนาดหน้าต่างได้ตามต้องการ: ผู้ใช้สามารถเปลี่ยนแปลงหน้าต่าง ความกว้าง ความสูง และตำแหน่งบนหน้าจอ แอป Android จำนวนมากเขียนขึ้นโดยไม่มี ในการปรับขนาดอัตโนมัติ ลองพิจารณาประเด็นเหล่านี้

  • ตำแหน่งหน้าจออาจมีการเปลี่ยนแปลง ใช้เมธอด ระบบในการแปลงพิกัดจากหน้าต่างสู่หน้าจอ และหน้าจอเป็นหน้าต่าง
  • ถ้าคุณกำลังใช้ระบบมุมมองของ Android การจัดวางหน้าต่างของคุณ เปลี่ยนโดยอัตโนมัติเมื่อเปลี่ยนขนาด
  • หากคุณไม่ได้ใช้ระบบมุมมองและรับช่วงพื้นที่ แอปจะต้อง จัดการการเปลี่ยนแปลงขนาดได้เอง
  • สำหรับแอปที่มาพร้อมเครื่อง ให้ใช้สมาชิก mLastContent หรือใช้มุมมองเนื้อหาเพื่อ ระบุขนาดเริ่มต้น
  • เมื่อแอปกำลังทำงาน ให้ฟังonContentRectChangedNativeหรือ onGlobalLayout เหตุการณ์เพื่อตอบสนองต่อการเปลี่ยนแปลงขนาด
  • เมื่อขนาดของแอปเปลี่ยนแปลง ให้ปรับขนาดหรือโหลดเลย์เอาต์และอาร์ตเวิร์กซ้ำ และอัปเดตพื้นที่อินพุต

โหมดเต็มหน้าจอ

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

การวางแนวหน้าจอ

การวางแนวที่ใช้กันมากที่สุดสำหรับแอป Android คือ แนวตั้ง เพราะนั่นทำให้ ของโทรศัพท์ส่วนใหญ่ แม้ว่าภาพบุคคลจะเหมาะสำหรับโทรศัพท์ แต่ แล็ปท็อปและแท็บเล็ต และควรใช้วิดีโอแนวนอน โดยวิธีการมีดังนี้ ผลลัพธ์ที่ดีที่สุดสำหรับแอปของคุณ ให้พิจารณารองรับการวางแนวทั้ง 2 แบบ

แอป Android บางแอปจะถือว่าเมื่อถืออุปกรณ์ในโหมดแนวตั้ง ค่าการหมุนเวียนคือ Surface.ROTATION_0 ซึ่งอาจเป็นจริงในอุปกรณ์ Android ส่วนใหญ่ อย่างไรก็ตาม เมื่อแอปอยู่ใน แน่นอน โหมด ARC ค่าการหมุนสำหรับแนวตั้งอาจไม่ได้ Surface.ROTATION_0

เพื่อให้ได้ค่าการหมุนที่แม่นยำขณะอ่านตัวตรวจวัดความเร่งหรือตัวตรวจวัดความเร่งที่คล้ายกัน เซ็นเซอร์ ใช้ Display.getRotation() และสลับแกนตามความเหมาะสม

กิจกรรมรูทและการวางแนว

หน้าต่าง Chromebook ประกอบด้วยกลุ่มหน้าต่างกิจกรรม แต่ละหน้าต่าง ในกลุ่มจะมีขนาดและการวางแนวเท่ากัน

การวางแนวและการเปลี่ยนขนาดอย่างกะทันหันจะสร้างความสับสนในเดสก์ท็อป ของคุณ ตัวจัดการหน้าต่าง Chromebook จะเลี่ยงการดำเนินการนี้ในลักษณะที่คล้ายกัน ไปยังโหมดแสดงคู่กันของ Android: กิจกรรมที่ด้านล่างของการควบคุมสแต็ก แอตทริบิวต์ของกิจกรรมทั้งหมดที่อยู่ด้านบน ซึ่งอาจทำให้เกิดเหตุการณ์ที่ไม่คาดคิด ที่กิจกรรมที่เพิ่งเริ่มต้นซึ่งเป็นแนวตั้งและปรับขนาดไม่ได้จะกลายเป็นแนวนอน และปรับขนาดได้

โหมดอุปกรณ์จะมีผลที่นี่: ในโหมดแท็บเล็ต การวางแนวจะไม่ล็อก และ แต่ละหน้าต่างจะมีการวางแนวของตัวเอง ซึ่งเป็นเรื่องปกติบน Android

หลักเกณฑ์การวางแนว

ทำตามหลักเกณฑ์ต่อไปนี้สำหรับการจัดการการวางแนว

  • หากคุณรองรับการวางแนวเพียงแนวเดียว ให้เพิ่มข้อมูลลงในไฟล์ Manifest เพื่อให้ ซึ่งผู้จัดการหน้าต่างจะทราบเรื่องนี้ก่อนเริ่มแอปพลิเคชัน เมื่อคุณ ระบุการวางแนว รวมทั้งระบุการวางแนวเซ็นเซอร์หากเป็นไปได้ Chromebook มักจะเป็นอุปกรณ์ที่พับจอได้ และแอปกลับหัวทำให้ประสบการณ์ของผู้ใช้แย่
  • พยายามใช้การวางแนวที่เลือกเพียงแบบเดียว หลีกเลี่ยงการขอการวางแนวเพียงแนวเดียว ในไฟล์ Manifest และตั้งค่ารายการอื่นในภายหลัง
  • โปรดระมัดระวังการเปลี่ยนการวางแนวตามขนาดหน้าต่าง ผู้ใช้อาจได้รับ ติดอยู่ในหน้าต่างแนวตั้งขนาดเล็กๆ และไม่สามารถกลับไปที่หน้าต่างขนาดใหญ่ หน้าต่างแนวนอน
  • มีการควบคุมหน้าต่างใน Chrome ให้สลับระหว่างการควบคุมทั้งหมดที่พร้อมใช้งาน เลย์เอาต์ เมื่อเลือกตัวเลือกการวางแนวที่เหมาะสม คุณจะแน่ใจได้ว่าผู้ใช้ มีเลย์เอาต์ที่ถูกต้องหลังจากเปิดแอป หากแอปพร้อมใช้งานในแนวตั้ง และแนวนอน ให้ตั้งเป็นแนวนอน หากเป็นไปได้ หลังจากตั้งค่าตัวเลือกนี้แล้ว เพราะเป็นที่จดจำในระดับแอป
  • พยายามหลีกเลี่ยงการเปลี่ยนแปลงการวางแนวโดยไม่จำเป็น ตัวอย่างเช่น หากกิจกรรม การวางแนวเป็นแนวตั้ง แต่แอปเรียก setRequestedOrientation(LANDSCAPE) ขณะรันไทม์ จะทำให้เกิดการปรับขนาดหน้าต่างที่ไม่จำเป็น ซึ่งจะสร้างความรำคาญต่อ และอาจรีสตาร์ทแอปซึ่งแอปจะไม่สามารถจัดการได้ คุณควรตั้งค่า การวางแนวเพียงครั้งเดียว เช่น ในไฟล์ Manifest และเปลี่ยนเฉพาะการวางแนว หากจำเป็น

ปัจจัยพิจารณาอื่นๆ

ต่อไปนี้เป็นสิ่งอื่นๆ ที่ควรพิจารณาเมื่อทำงานกับแอป Android ChromeOS

  • อย่าเรียกใช้ finish() ในเมธอด onDestroy ของกิจกรรม ซึ่งทำให้ ปิดแอปเมื่อปรับขนาดและไม่รีสตาร์ท
  • อย่าใช้ประเภทหน้าต่างที่ใช้ร่วมกันไม่ได้ เช่น TYPE_KEYGUARD และ TYPE_APPLICATION_MEDIA
  • ทำให้กิจกรรมรีสตาร์ทได้อย่างรวดเร็วด้วยการแคชออบเจ็กต์ที่ ที่จัดสรรไว้ก่อนหน้านี้
  • หากไม่ต้องการให้ผู้ใช้ปรับขนาดแอป ให้ระบุ android:resizeableActivity=false ในไฟล์ Manifest
  • ทดสอบแอปเพื่อให้มั่นใจว่าสามารถรองรับการเปลี่ยนแปลงใน ขนาดของหน้าต่างอย่างเหมาะสม