Büyük ekranda yeniden boyutlandırılabilirliği destekleme

Telefonlardan geniş ekranlı farklı form faktörlerine geçmek, oyununuzun pencere yönetimini nasıl ele aldığıyla ilgili dikkat edilmesi gereken noktaları da beraberinde getiriyor. ChromeOS ve PC Üzerinde Google Play Games'de, oyununuz ana masaüstü arayüzü üzerinden pencereli modda çalışabilir. Android 12L (API düzeyi 32) veya daha yeni bir ekran genişliğine sahip olan, Android 12L (API düzeyi 32) veya daha yeni sürümleri çalıştıran yeni Android tabletlerde ve katlanabilir cihazlarda oyununuz, bölünmüş ekran modunda diğer uygulamalarla yan yana çalışabilir, yeniden boyutlandırılabilir, hatta katlanabilir cihazlarda iç ve dış ekran arasında hareket ettirilebilir. Bu durum, bazı cihazlarda pencere boyutu ve yönüyle ilgili yapılandırma değişikliğine neden olur.

Temel büyük ekran yapılandırması

Oyununuzun yeniden boyutlandırılabilir olup olmadığını belirtin:

<android:resizeableActivity="true" or "false" />

Yeniden boyutlandırma desteklenemiyorsa oyun manifestinin desteklenen minimum ve maksimum en boy oranlarını açıkça tanımladığından emin olun:

<!-- 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">

PC Üzerinde Google Play Games

Platform, PC Üzerinde Google Play Games'de belirtilen en boy oranını dikkate alarak pencerelerin yeniden boyutlandırılabilirliğini işler. Pencere boyutu, en uygun boyutlara otomatik olarak kilitlenir. Birincil yönünüz yatay ise en az 16:9 en boy oranını, oyununuz dikey moddaysa 9:16 en boy oranını desteklemeniz gerekir. En iyi deneyim için yatay oyunlarda 21:9, 16:10 ve 3:2 en boy oranlarını açıkça destekleyin. Pencerenin yeniden boyutlandırılması burada gerekli değildir ancak diğer form faktörü uyumluluğu için de faydalıdır.

Daha fazla bilgi edinmek ve en iyi uygulamaları öğrenmek için PC Üzerinde Google Play Games için grafikleri yapılandırma başlıklı makaleyi inceleyin.

ChromeOS ve Android büyük ekranlar

Oyununuzun görüntülenebilir alanını ChromeOS'te ve büyük ekran Android cihazlarda tam ekran modunda en üst düzeye çıkarmak için tam ekran yoğun içerik modunu destekleyin ve decorView üzerinde işaretleri, sistem kullanıcı arayüzü görünürlüğüyle veya WindowInsetsCompat API'si üzerinden işaretleri ayarlayarak sistem çubuklarını gizleyin. Ayrıca döndürme ve yeniden boyutlandırma etkinliklerini sorunsuz şekilde yönetmek veya bunların ChromeOS cihazlarda meydana gelmesini engellemek isteyebilirsiniz.

Oyununuzun, büyük ekranlı Android cihazlarda sizin hazırlamadığınız yapılandırmalarda çalışabileceğini unutmayın. Oyununuz tüm pencere boyutu ve yön yapılandırmalarını desteklemiyorsa platform, oyununuza uyumluluk modunda sinemaskoplar ekler ve gerekirse desteklenmeyen bir yapılandırmaya geçmeden önce oyuncudan bilgi ister.

Şekil 1. Yapılandırma uyumluluğu iletişim kutusu.

Bazı cihazlarda, desteklenmeyen bir yapılandırmaya geçen oyuncudan oyunu yeniden yükleme ve etkinliği yeni pencere düzenine uyacak şekilde yeniden oluşturma seçeneği istenebilir. Bu da oyun deneyimini bozar. Oyununuzu çeşitli çoklu pencere modu yapılandırmalarında (2/3, 1/2, 1/3 pencere boyutu) test edin ve oyun veya kullanıcı arayüzü öğelerinin kesildiğini veya erişilemez hale geldiğini doğrulayın. Ayrıca, katlanabilir cihazlarda iç ve dış ekranlar arasında geçiş yaparken oyununuzun katlanabilir devamlılığa nasıl tepki verdiğini test edin. Sorun görürseniz bu yapılandırma etkinliklerini açıkça ele alın ve gelişmiş büyük ekran yeniden boyutlandırılabilirlik desteği ekleyin.

Gelişmiş büyük ekranda yeniden boyutlandırılabilirlik

Şekil 2. Masaüstünde farklı kullanıcı arayüzleri ve masa üstü pozisyonda katlanabilir.

Uyumluluk modundan çıkmak ve etkinliğin yeniden oluşturulmasını önlemek için aşağıdakileri yapın:

  1. Ana etkinliğinizi yeniden boyutlandırılabilir olarak bildirin:

    <android:resizeableActivity="true" />
    
  2. Tüm büyük ekran yapılandırma etkinliklerini almak için oyun manifestinizin <activity> öğesinin android:configChanges özelliğinde "orientation", "screenSize", "smallestScreenSize", "screenLayout" ve "density" için açıkça destek beyan edin:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. onConfigurationChanged() alanını geçersiz kılın ve mevcut yön, pencere boyutu, genişlik ve yükseklik de dahil olmak üzere yapılandırma etkinliğini gerçekleştirin:

    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();
    }
    

Geçerli cihaz rotasyonunu kontrol etmek için WindowManager'ı da sorgulayabilirsiniz. Bu meta veriyi kullanarak yeni pencere boyutlarını kontrol edin ve tam pencere boyutunda oluşturun. Bu, en boy oranı farklılıkları nedeniyle her durumda işe yaramayabilir. Bu nedenle, alternatif olarak oyun kullanıcı arayüzünüzü temel oyun içeriğinizin yeni pencere boyutuna ve sinemaskop biçimine sabitleyin. Bu yaklaşımlardan herhangi birini engelleyen teknik veya tasarım sınırlamaları varsa en boy oranını korumak için motor içinde sinemaskop yapın ve resizeableActivity = false özelliğini tanımlayıp yapılandırma modundan kaçınarak mümkün olan en iyi boyutlara ölçeklendirin.

Kullandığınız yaklaşımdan bağımsız olarak, oyununuzu çeşitli yapılandırmalarda test edin (katlama ve açma, farklı döndürme değişiklikleri, bölünmüş ekran modu) ve kesilmiş veya çakışan oyun içi kullanıcı arayüzü öğeleri olmadığından, dokunma hedefi erişilebilirlikle ilgili ya da oyunun uzatılmasına, sıkıştırılmasına veya başka bir şekilde bozulmasına neden olan en boy oranı sorunları olmadığından emin olun.

Buna ek olarak, daha büyük bir alan için aynı sayıda piksele sahip olduğunuzdan, daha büyük ekranlar genellikle daha büyük piksel anlamına gelir. Bu, boyutu küçültülmüş oluşturma arabellekleri veya düşük çözünürlüklü öğeler için pikselleşmeye neden olabilir. Herhangi bir sorun olmaması için büyük ekranlı cihazlarda en kaliteli öğelerinizi ve oyununuzun performans profilini kullanın. Oyununuz birden fazla kalite seviyesini destekliyorsa büyük ekranlı cihazlara uygun olduğundan emin olun.

Birden fazla pencere modu

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı aynı anda paylaşmasına olanak tanır. Çoklu pencere modu etkinlik yaşam döngüsünü değiştirmez ancak birden fazla penceredeki uygulamaların devam ettirilme durumu Android'in farklı sürümlerinde farklılık gösterir (Çok pencere desteği'ndeki Çoklu pencere modunda etkinlik yaşam döngüsü bölümüne bakın).

Oyuncu bir uygulamayı veya oyunu çoklu pencere moduna aldığında sistem, Gelişmiş büyük ekranda yeniden boyutlandırılabilirlik bölümünde belirtildiği gibi bir yapılandırma değişikliği etkinliği bildirir. Oyuncu oyunu yeniden boyutlandırdığında veya oyunu tekrar tam ekran moduna getirdiğinde de yapılandırma değişikliği olur.

Çoklu pencere moduna alınan uygulamanın odağı tekrar kazanacağına dair bir garanti yoktur. Bu nedenle, oyununuzu duraklatmak için uygulama durumu etkinliklerinden herhangi birini kullanırsanız oyunu devam ettirmek için odaklama etkinliğine (odak değeri true olarak onWindowFocusChanged()) güvenmeyin. Bunun yerine, diğer etkinlik işleyicileri veya onConfigurationChanged() ya da onResume() gibi durum değişikliği işleyicileri kullanın. Geçerli etkinliğin çoklu pencere modunda çalışıp çalışmadığını belirlemek için istediğiniz zaman isInMultiWindowMode() yöntemini kullanabileceğinizi unutmayın.

ChromeOS'te çoklu pencere moduyla, ilk pencere boyutları önemli bir nokta haline gelir. Bir oyunun tam ekran olması gerekmez ve bu durumda pencere boyutunun ne kadar olması gerektiğini bildirmeniz gerekir. Bu duruma yaklaşmak için önerilen iki yol vardır.

İlk seçenek, Android manifest dosyanızdaki <layout> etiketinde bulunan belirli özellikler kullanılarak çalışır. defaultHeight ve defaultWidth özellikleri başlangıç boyutlarını kontrol eder. Oyuncularınızın oyun penceresini desteklemediğiniz boyutlara yeniden boyutlandırmasını önlemek için minHeight ve minWidth özelliklerine de dikkat edin. Son olarak, başlatıldığında pencerenin ekranın neresinde görüneceğini belirleyen gravity özelliği vardır. Aşağıda, bu öznitelikleri kullanan bir düzen etiketi örneği verilmiştir:

<layout android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minHeight="450dp"
        android:minWidth="300dp" />

Pencere boyutunu ayarlamak için ikinci seçenek, dinamik başlatma sınırları kullanılarak çalışır. setLaunchBounds(Rect)⁠⁠ kullanarak başlangıç aralığı boyutlarını tanımlayabilirsiniz. Boş bir dikdörtgen belirtilirse etkinlik, ekranı kaplayacak şekilde başlatılır.

Ayrıca, Unity veya Unreal oyun motorlarını kullanıyorsanız, çoklu pencere modu için iyi destek sağlayan yeni bir sürüm (Unity 2019.4.40 ve Unreal 5.3 ya da daha yenileri) kullandığınızdan emin olun.

Katlanabilir pozisyon desteği

Oyuncuların içine daldırılmasını ve katılımını artırmak amacıyla masa üstü gibi katlanabilir pozisyonları desteklemek üzere Jetpack WindowManager düzen kitaplığını kullanın:

Şekil 3. Ekranın dikey bölümünde ana görünüm, yatay bölümde kontrollerle masa üstü duruşuyla oyun.

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);
}