การขยายการให้บริการจากโทรศัพท์ไปยังอุปกรณ์รูปแบบต่างๆ ที่มีหน้าจอขนาดใหญ่จะทำให้เกิดข้อควรพิจารณาเกี่ยวกับวิธีที่เกมจัดการการจัดการหน้าต่าง ใน ChromeOS และ Google Play Games บน PC เกมจะทำงานในโหมดที่มีหน้าต่างบนอินเทอร์เฟซหลักของเดสก์ท็อปได้ ในแท็บเล็ต Android และอุปกรณ์แบบพับได้รุ่นใหม่ที่ใช้ Android 12L (API ระดับ 32) ขึ้นไปที่มีหน้าจอกว้างกว่า 600dp เกมจะทำงานควบคู่กันในโหมดแยกหน้าจอกับแอปพลิเคชันอื่นๆ ปรับขนาด และแม้แต่ย้ายไปมาระหว่างจอแสดงผลด้านในและด้านนอกในอุปกรณ์แบบพับได้ ซึ่งส่งผลให้มีการเปลี่ยนแปลงการกำหนดค่าสำหรับขนาดหน้าต่างและการวางแนวในอุปกรณ์บางรุ่น
การกำหนดค่าหน้าจอขนาดใหญ่ขั้นพื้นฐาน
ประกาศว่าเกมของคุณรองรับการปรับขนาดได้หรือไม่ โดยทำดังนี้
<android:resizeableActivity="true" or "false" />
หากไม่สามารถรองรับการปรับขนาดได้ ให้ตรวจสอบว่าไฟล์ Manifest ของเกมกำหนดสัดส่วนภาพขั้นต่ำและสูงสุดที่รองรับไว้อย่างชัดเจน ดังนี้
<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">
Google Play Games บน PC
สำหรับ Google Play Games บน PC แพลตฟอร์มจะจัดการการปรับขนาดหน้าต่างโดยคำนึงถึงสัดส่วนภาพที่ระบุ ระบบจะล็อกขนาดหน้าต่างเป็นขนาดที่เหมาะสมโดยอัตโนมัติ คุณต้องรองรับสัดส่วนภาพอย่างน้อย 16:9 หากการวางแนวหลักเป็นแนวนอน และสัดส่วนภาพ 9:16 หากเกมเป็นโหมดแนวตั้ง รองรับสัดส่วนภาพ 21:9, 16:10 และ 3:2 สำหรับเกมแนวนอนอย่างชัดเจนเพื่อให้ได้รับประสบการณ์การใช้งานที่ดีที่สุด ไม่จำเป็นต้องปรับขนาดหน้าต่างได้ แต่ก็ยังควรมีไว้เพื่อให้เข้ากันได้กับรูปแบบอื่นๆ
ดูข้อมูลเพิ่มเติมและแนวทางปฏิบัติแนะนำได้ที่กำหนดค่ากราฟิกสำหรับ Google Play Games บน PC
หน้าจอขนาดใหญ่ของ ChromeOS และ Android
หากต้องการเพิ่มพื้นที่ที่มองเห็นได้สูงสุดสำหรับเกมแบบเต็มหน้าจอใน ChromeOS และอุปกรณ์ Android หน้าจอขนาดใหญ่ ให้รองรับโหมดสมจริงแบบเต็มหน้าจอและซ่อนแถบระบบโดยตั้งค่า Flag ใน decorView
, ระดับการมองเห็น UI ของระบบ หรือผ่าน WindowInsetsCompat
API นอกจากนี้ คุณยังต้องจัดการเหตุการณ์การกำหนดค่าการหมุนและการปรับขนาดอย่างราบรื่น หรือป้องกันไม่ให้เหตุการณ์ดังกล่าวเกิดขึ้นในอุปกรณ์ ChromeOS ด้วย
โปรดทราบว่าในอุปกรณ์ Android หน้าจอขนาดใหญ่ เกมอาจทำงานในการกําหนดค่าที่คุณอาจยังไม่รองรับ หากเกมของคุณไม่รองรับการกำหนดค่าขนาดหน้าต่างและการวางแนวทั้งหมด แพลตฟอร์มจะใส่แถบดำด้านบนและด้านล่างของเกมในโหมดความเข้ากันได้ และแจ้งให้ผู้เล่นทราบก่อนเปลี่ยนเป็นการกำหนดค่าที่ไม่รองรับ (หากจำเป็น)

ในอุปกรณ์บางรุ่น เมื่อผู้เล่นเปลี่ยนไปใช้การกำหนดค่าที่ไม่รองรับ ระบบอาจแสดงตัวเลือกให้โหลดเกมซ้ำและสร้างกิจกรรมอีกครั้งเพื่อให้เหมาะกับเลย์เอาต์หน้าต่างใหม่มากที่สุด ซึ่งจะรบกวนประสบการณ์การเล่นเกม ทดสอบเกมในการกําหนดค่าโหมดหลายหน้าต่างแบบต่างๆ (ขนาดหน้าต่าง 2/3, 1/2, 1/3) และตรวจสอบว่าไม่มีองค์ประกอบเกมเพลย์หรือ UI ที่ถูกตัดออกหรือเข้าถึงไม่ได้ นอกจากนี้ ให้ทดสอบว่าเกมตอบสนองต่อความต่อเนื่องของหน้าจอแบบพับอย่างไรเมื่อเลื่อนไปมาระหว่างหน้าจอด้านในและด้านนอกในอุปกรณ์แบบพับ หากพบปัญหา ให้จัดการเหตุการณ์การกําหนดค่าเหล่านี้อย่างชัดเจนและเพิ่มการรองรับการปรับขนาดหน้าจอขนาดใหญ่ขั้นสูง
ความสามารถในการปรับขนาดหน้าจอขนาดใหญ่ขั้นสูง
หากต้องการออกจากโหมดความเข้ากันได้และหลีกเลี่ยงการสร้างกิจกรรมอีกครั้ง ให้ทําดังนี้
ประกาศว่ากิจกรรมหลักปรับขนาดได้
<android:resizeableActivity="true" />
ประกาศการรองรับ "orientation", "screenSize", "smallestScreenSize", "screenLayout" และ "density" อย่างชัดเจนในแอตทริบิวต์
android:configChanges
ขององค์ประกอบ<activity>
ในไฟล์ Manifest ของเกมเพื่อรับเหตุการณ์การกำหนดค่าหน้าจอขนาดใหญ่ทั้งหมด<android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard | keyboardHidden | density" />
ลบล้าง
onConfigurationChanged()
และจัดการเหตุการณ์การกําหนดค่า ซึ่งรวมถึงการวางแนวปัจจุบัน ขนาดหน้าต่าง ความกว้าง และความสูงKotlin
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val density: Float = resources.displayMetrics.density val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt() val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt() // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE val newScreenOrientation: Int = newConfig.orientation // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270 val newScreenRotation: Int = windowManager.defaultDisplay.rotation }
Java
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); float density = getResources().getDisplayMetrics().density; int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density); int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density); // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE int newScreenOrientation = newConfig.orientation; // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270 int newScreenRotation = getWindowManager().getDefaultDisplay() .getRotation(); }
นอกจากนี้ คุณยังค้นหา WindowManager
เพื่อตรวจสอบการหมุนของอุปกรณ์ปัจจุบันได้ด้วย ใช้ข้อมูลเมตานี้เพื่อตรวจสอบขนาดหน้าต่างใหม่และแสดงผลเป็นขนาดหน้าต่างเต็ม วิธีนี้อาจใช้ไม่ได้กับบางกรณีเนื่องจากสัดส่วนภาพที่แตกต่างกัน คุณจึงอาจต้องยึด UI ของเกมไว้กับขนาดหน้าต่างใหม่และใส่แถบดำด้านบนและด้านล่างในเนื้อหาเกมเพลย์หลัก หากมีข้อจำกัดทางเทคนิคหรือการออกแบบที่ทำให้ใช้แนวทางใดแนวทางหนึ่งไม่ได้ ให้ใช้การใส่แถบดำด้านบนและด้านล่างในเครื่องมือเพื่อรักษาสัดส่วนภาพ และปรับขนาดเป็นมิติข้อมูลที่ดีที่สุดขณะประกาศ resizeableActivity = false
และหลีกเลี่ยงโหมดการกําหนดค่า
ไม่ว่าจะใช้แนวทางใดก็ตาม ให้ทดสอบเกมในการกำหนดค่าต่างๆ (การพับและการกางออก การเปลี่ยนแปลงการหมุนแบบต่างๆ โหมดแยกหน้าจอ) และตรวจสอบว่าไม่มีองค์ประกอบ UI ในเกมที่ถูกตัดออกหรือซ้อนทับกัน ปัญหาการเข้าถึงเป้าหมายการสัมผัส หรือปัญหาสัดส่วนภาพที่ทำให้เกมยืดออก บีบอัด หรือบิดเบี้ยว
นอกจากนี้ หน้าจอขนาดใหญ่มักจะหมายถึงพิกเซลที่ใหญ่ขึ้นด้วย เนื่องจากคุณมีพิกเซลเท่าเดิมสำหรับพื้นที่ที่ใหญ่ขึ้นมาก ซึ่งอาจทําให้ภาพแตกเป็นพิกเซลสําหรับบัฟเฟอร์การแสดงผลที่ปรับขนาดลงหรือชิ้นงานที่ความละเอียดต่ำ ใช้ชิ้นงานคุณภาพสูงสุดในอุปกรณ์หน้าจอขนาดใหญ่และโปรไฟล์ประสิทธิภาพของเกมเพื่อให้มั่นใจว่าไม่มีปัญหา หากเกมรองรับคุณภาพหลายระดับ โปรดตรวจสอบว่าเกมรองรับอุปกรณ์ที่มีหน้าจอขนาดใหญ่
โหมดหลายหน้าต่าง
โหมดหลายหน้าต่างช่วยให้แอปหลายแอปใช้หน้าจอเดียวกันได้พร้อมกัน โหมดหลายหน้าต่างจะไม่เปลี่ยนวงจรของกิจกรรม อย่างไรก็ตาม สถานะการกลับมาทำงานของแอปในหลายหน้าต่างจะแตกต่างกันไปตาม Android แต่ละเวอร์ชัน (ดูวงจรของกิจกรรมในโหมดหลายหน้าต่างในส่วนรองรับโหมดหลายหน้าต่าง)
เมื่อผู้เล่นเปิดแอปหรือเกมในโหมดหลายหน้าต่าง ระบบจะแจ้งกิจกรรมของการเปลี่ยนแปลงการกำหนดค่าตามที่ระบุไว้ในส่วนความสามารถในการปรับขนาดหน้าจอขนาดใหญ่ขั้นสูง การเปลี่ยนแปลงการกำหนดค่าจะเกิดขึ้นเมื่อผู้เล่นปรับขนาดเกมหรือเปลี่ยนเกมกลับไปเป็นโหมดเต็มหน้าจอด้วย
เราไม่รับประกันว่าแอปพลิเคชันจะได้รับโฟกัสอีกครั้งเมื่ออยู่ในโหมดหลายหน้าต่าง ดังนั้น หากคุณใช้เหตุการณ์สถานะแอปเพื่อหยุดเกมชั่วคราว อย่าใช้เหตุการณ์รับโฟกัส (onWindowFocusChanged()
ที่มีค่าโฟกัสเป็น "จริง") เพื่อกลับมาเล่นต่อ แต่ให้ใช้ตัวแฮนเดิลเหตุการณ์หรือตัวแฮนเดิลการเปลี่ยนแปลงสถานะอื่นๆ เช่น onConfigurationChanged()
หรือ onResume()
โปรดทราบว่าคุณใช้เมธอด isInMultiWindowMode()
ได้ทุกเมื่อเพื่อตรวจจับว่ากิจกรรมปัจจุบันทํางานในโหมดหลายหน้าต่างหรือไม่
เมื่อใช้โหมดหลายหน้าต่างใน ChromeOS ขนาดหน้าต่างเริ่มต้นจะกลายเป็นสิ่งสําคัญที่ต้องพิจารณา เกมไม่จำเป็นต้องแสดงแบบเต็มหน้าจอ และคุณจะต้องประกาศขนาดของหน้าต่างสำหรับกรณีดังกล่าว เราขอแนะนํา 2 วิธีในการดำเนินการนี้
ตัวเลือกแรกจะทํางานโดยใช้แอตทริบิวต์ที่เฉพาะเจาะจงในแท็ก <layout>
ในไฟล์ Manifest ของ Android แอตทริบิวต์ defaultHeight
และ defaultWidth
จะควบคุมมิติข้อมูลเริ่มต้น นอกจากนี้ โปรดคำนึงถึงแอตทริบิวต์ minHeight
และ minWidth
ด้วยเพื่อป้องกันไม่ให้ผู้เล่นปรับขนาดหน้าต่างเกมเป็นขนาดที่คุณไม่รองรับ สุดท้ายคือแอตทริบิวต์ gravity
ซึ่งกำหนดตําแหน่งบนหน้าจอที่หน้าต่างจะปรากฏขึ้นเมื่อเปิด ตัวอย่างแท็กเลย์เอาต์ที่ใช้แอตทริบิวต์เหล่านี้มีดังนี้
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minHeight="450dp"
android:minWidth="300dp" />
ตัวเลือกที่ 2 สำหรับการตั้งค่าขนาดหน้าต่างจะทํางานโดยใช้ขอบเขตการเริ่มแบบไดนามิก เมื่อใช้ setLaunchBounds(Rect)
คุณจะกําหนดมิติข้อมูลกรอบเวลาเริ่มต้นได้ หากระบุสี่เหลี่ยมผืนผ้าว่างเปล่า ระบบจะเริ่มกิจกรรมในสถานะขยายสูงสุด
นอกจากนี้ หากคุณใช้เครื่องมือสร้างเกม Unity หรือ Unreal โปรดตรวจสอบว่าคุณใช้เวอร์ชันล่าสุด (Unity 2019.4.40 และ Unreal 5.3 ขึ้นไป) ที่รองรับโหมดหลายหน้าต่างได้ดี
รองรับท่าทางแบบพับได้
ใช้ไลบรารีเลย์เอาต์ WindowManager ของ Jetpack เพื่อรองรับลักษณะการใช้งานแบบพับได้ เช่น ตั้งโต๊ะ เพื่อเพิ่มความสมจริงและการมีส่วนร่วมของผู้เล่น

Kotlin
fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean { contract { returns(true) implies (foldFeature != null) } return foldFeature?.state == FoldingFeature.State.HALF_OPENED && foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL }
Java
boolean isTableTopPosture(FoldingFeature foldFeature) { return (foldFeature != null) && (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) && (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL); }