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