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

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

หน้าต่างแอปในอุปกรณ์ต่างๆ
รูปที่ 1: คำบรรยายภาพจะอยู่ที่นี่

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

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

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

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

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

  • ใช้ขนาดการเปิดตัวในสภาพแวดล้อมเดสก์ท็อปเท่านั้น ซึ่งจะช่วยให้ตัวจัดการหน้าต่างกำหนดขอบเขตและการวางแนวที่เหมาะสมให้คุณได้ หากต้องการระบุค่ากําหนดเมื่อใช้ในโหมดเดสก์ท็อป ให้เพิ่มเมตาแท็กต่อไปนี้ภายใน <activity>

    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowSize&#34;
               android:value=&#34;[phone|tablet|maximize]&#34; /&gt;
    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowOrientation&#34;
               android:value=&#34;[portrait|landscape]&#34; /&gt;
    
  • ใช้ขอบเขตการเปิดแบบคงที่ ใช้ <layout> ภายในรายการ Manifest ของกิจกรรมเพื่อระบุขนาดเริ่มต้น "คงที่" ดังตัวอย่างต่อไปนี้

    &lt;layout android:defaultHeight=&#34;500dp&#34;
                android:defaultWidth=&#34;600dp&#34;
                android:gravity=&#34;top|end&#34;
                android:minHeight=&#34;450dp&#34;
                android:minWidth=&#34;300dp&#34; /&gt;
    
  • ใช้ขอบเขตการเปิดตัวแบบไดนามิก กิจกรรมสามารถสร้างและใช้ ActivityOptions.setLaunchBounds(Rect) เมื่อสร้างกิจกรรมใหม่ การระบุสี่เหลี่ยมผืนผ้าว่างเปล่าจะช่วยให้แอปของคุณขยายได้สูงสุด

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

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

รูปที่ 2: คำบรรยายภาพจะอยู่ที่นี่

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

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

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

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

    การตรวจสอบอย่างต่อเนื่องทำได้โดยใช้ Observer ดังนี้

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • เพิ่มผู้ฟังไปยัง 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 ค่าการหมุนสำหรับแนวตั้งอาจไม่ใช่ Surface.ROTATION_0

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

กิจกรรมและการปฐมนิเทศ

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

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

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

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

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

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

ข้อควรพิจารณาอื่นๆ

นอกจากนี้ ยังมีสิ่งอื่นๆ ที่ควรพิจารณาเมื่อใช้แอป Android ใน ChromeOS ดังนี้

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