Android oyununu farklı ekran boyutlarına sığdırma


11

Sadece dikey ekran yönünde bir Android oyunu yapıyorum. Telefonumda çalıştırdığımda harika çalışıyor, ancak ekran boyutu daha büyük olsa da, tüm bitmap'ler aynı boyutta. Bitmap'lerin farklı boyut ekranlarında bile aynı oranda kalmasını sağlamanın bir yolu var mı?

Yanıtlar:


11

AbsoluteLayout'u kullanmadığınız sürece (Düzeninizi yalnızca tasarlandığı cihaza uyacak x / y koordinatlarını kullanarak tasarlarken genellikle çok kötü bir fikir) bu gerçekleşmemelidir - Android uygulamaları otomatik olarak cihazın ekran boyutuna göre ayarlanır . Ancak, açıkladığınızdan (Düzen Tablo Ekranına ayarlanmaz), AbsoluteLayout'un burada sorun olabileceği anlaşılıyor.

Düzen XML dosyalarınızda mutlak düzenler KULLANMADIĞINIZDAN emin olun (bu, herhangi bir Görünümde açık koordinatlar / genişlikler / yükseklikler ayarlamayı içerir). Bunun yerine şunları kullanmayı düşünün:

  • LinearLayout - Birden çok görünümü yatay veya dikey olarak yığınlar
  • FrameLayout - Genellikle bir Çocuk içerir
  • RelativeLayout - Çocukları birbirine göre hizalayın
  • TableLayout - Tablo tabanlı bir düzen
  • ScrollView - Bir alt öğe (LinearLayout gibi) içerebilir ve içeriği kaydırmanıza olanak tanır

... amacınıza en uygun olanı.

Android'de yeniyseniz , Google yukarıda belirtilen farklı Yerleşim Türlerini tanıtan güzel bir öğretici sunar . Daha fazla öğretici burada bulunabilir .

Ayrıca API Seviyeniz (Android 2.x veya 4.x kullanıp kullanmadığınızı bilmek için - Akıllı Telefonlar için mevcut olmadığından 3.x olduğunu sanmıyorum) sorununuzun nedenini bulmak için alakalı olacaktır.

Aşağıdakileri ayarlayarak Uygulamanızı Portre moduna zorluyor musunuz?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set screen orientation for this dialog to portrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

... Aktivitenizde oyunun görüntülerini gösteren?

Lütfen görünümlerinizi nasıl düzenlediğinizle ilgili daha fazla bilgi verin (daha sonra Etkinliğinizde şişirdiğiniz düzen için XML mi kullanıyorsunuz, yoksa Etkinliklerinizde kod içi düzen mi kullanıyorsunuz vb.)? Ayrıca: Uygulamanızı bir Akıllı Telefon ve Tablet Boyutlu Emülatörde çalıştırmayı denediniz mi? Evetse sorun devam ediyor mu?


GÜNCELLEME: BİTMAPS NASIL ÖLÇÜLÜR

OP oyunda kullandığı bitmap'leri nasıl ölçeklendirebileceğini sordu. Bir seçenek (OP kurulumu hakkında bildiğim her şeyden): Oyununuzu görüntülemek için geçersiz kıldığınız ve tüm Bitmap'leri vb. Oluşturduğunuz SurfaceHolder.Callback şu şekilde adlandırılır:

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

Bu yöntem size yüzeyinizin genişliğini / yüksekliğini verir, böylece şimdi kullanabilirsiniz:

Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

dan Bitmap sınıfının . Resimlerinizi üzerine çizdiğiniz yüzeyin boyutuyla orantılı olarak yeniden boyutlandırmak için.

Yapmanız gereken şudur: Bitmap'inizin belirli bir ekran boyutuyla ilişkili boyutlarını biliyorsanız, örneğin akıllı telefonunuzun ekran boyutu. Ardından ölçeklendirilmiş bitmap'lerin hedef boyutlarını hesaplayabilirsiniz. İşte matematik (bir örnekte sarılmış):

Eğer bir var ki Bitmap A boyutları 25x50 (genişlikxyükseklik) boyutlar (genişlikxyükseklik) 100x200 ile ekranda görüntülenir. Bu ekran boyutu (100x200) için bitmap doğru boyutlara sahiptir - şimdi bitmap'i daha büyük bir ekranda görüntülemek istiyorsanız şunları yapmanız gerekir:

  • Bitmap boyutu için ölçek faktörünü hesaplama
  • Bitmap'in en boy oranını koruyun (böylece bozulmaz)

Daha büyük ekranın 200x300 (genişlikx yükseklik) olduğunu ve genişlik için ölçek faktörünün:

200(target screen width)/100(default screen width) = 2

Yani 2 , bitmap'in genişlik ve yükseklik değeri için ölçek faktörünüzdür, çünkü bitmap'in en boy oranını korumamız gerektiğinden, ölçek faktörünü bitmap'in genişliği ve yüksekliği ile basitçe çarpabiliriz:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

Yukarıdaki örnek bitmap A ve belirtilen formülü kullanarak, bitmap'in yeni boyutları: 50x100 (widthxheight) çünkü:

 2*25(width) = 50 height
 2*50(height) = 100 height

Şimdi bitmap'imizin yeni boyutunu bildiğimize göre, yukarıda bahsettiğim API çağrısını kullanıyoruz ve boşlukları dolduruyoruz:

   Bitmap.createScaledBitmap (myBitmap, 50, 100, false)

Yukarıdaki örnekteki myBitmap, 25x50 boyutlarına sahip olan ve yukarıdaki kod snippet'i kullanılarak 50x100'e ölçeklendirilmiş orijinal bitmap A'dır.


Ancak , bu, tablet boyutundaki bir cihazın yalnızca sağ üst köşesini kaplayan uygulamadaki orijinal sorununuzu çözmez. Bunu cevaplamak için kurulumunuzla ilgili size sorduğumuz soruların cevaplarını isteriz. Onları burada çabucak özetleyeceğim:

  • AndEngine veya Unity gibi bir oyun motoru mu kullanıyorsunuz ?
  • Düzeninizi xml ile mi yazıyorsunuz? Evetse, oyun içeriğinizi oluşturmak için kök düzeniniz nedir?
  • SurfaceHolder.Callback uyguladığınızı söylemiş miydiniz? SurfaceChanged yöntem çağrısında sağlanan genişlik / yükseklik size yüzeyin boyutunu verir - uygulamanız bir akıllı telefonda veya tablette çalıştırıldığında aynı boyutta mı?
  • SurfaceView'e (veya uyguladığınız SurfaceHolder.Callback'e bağlı olan her ne varsa) erişiminiz var mı, bu yüzden uygulama boyutunu akıllı telefon boyutuna katı bir şekilde ayarlayanın bu olup olmadığını belirleyebiliriz.
  • Emülatörde farklı ekran çözünürlüklerinde aynı yeniden boyutlandırma sorunları oluşuyor mu?

Genel bir şüphe: Her akıllı telefon aynı ekran boyutuna sahip değil, aslında çok çeşitli ekran boyutları var, bu da beni meraklandırıyor: Uygulamanızı ekranınızdan farklı ekran boyutuna sahip bir akıllı telefonda hiç test ettiniz mi? Çünkü - bir tablete değil, ekranınıza uyması, bu boyutları kimin ne zaman ayarladığını merak ediyor. Bir uygulamanın tüm akıllı telefon ekran boyutlarına göre ayarlanabileceğinden, ancak tablet boyutlarına göre ayarlanabileceğinden şüphe duyduğumdan - pek mantıklı olmayacak (çünkü az ya da çok aynı android çekirdeği çalışıyor, sx, 3 arasındaki bazı farklılıklar. x ve 4.x bir yana) Tablet boyutunda ekran boyutlarını desteklemeyen bir çerçeveyi KULLANMADIĞINIZ (herhangi bir nedenle - tablet desteğini fazladan veya herhangi bir şekilde satın almanız gerekebilir). Bu nedenle, uygulamanın yalnızca telefonunuzda düzgün bir şekilde yeniden boyutlandırılıp boyutlandırılmadığını bilmek gerçekten önemlidir. veya diğer akıllı telefonlarda. Bir uygulamanın belirli bir telefonun ekran boyutuyla nasıl sınırlı olabileceğinin farkında olmanın tek yolu AbsoluteLayout ve widget'lar için genellikle mutlak boyutlar kullanmaktır ...


GÜNCELLEME: x / y Koordinatlarını Ölçeklendirme

Bitmap'inizin konumunu ekran boyutuna ayarlamak için, aşağıdakine benzer bir şey iş yapmalıdır:

  • Ekran boyutları: 100/200 (genişlik / yükseklik)
  • Bitmap konumu: x = 50 / y = 100

Şimdi, ekran boyutunu büyütürseniz, bu x / y değerlerini ölçeklendirmeniz gerekir:

  • Ekran boyutları: 200/400 (genişlik / yükseklik)

Ölçek faktörü 2 olacaktır, çünkü genişlik ve yükseklik eşit olarak iki kat artmıştır. Dolayısıyla boyutlar ...

  • Bitmap konumu: x = 100 / y = 200

Başka bir deneme - bu sefer genişlik / yükseklik için farklı ölçek faktörleriyle

  • Ekran boyutları: 100/150 (genişlik / yükseklik)
  • Bitmap konumu: x = 50 / y = 50

Yeni hedef ekran 150/250 ise hesaplamalar:

  • Genişlik için ölçek faktörü = targetWidth / originalWidth = 1.5
  • Yükseklik için ölçek faktörü = targetHeight / originalHeight = 1.666 ... (Dönem)

Şimdi x / y koordinatlarını ölçeklemeliyiz, x genişlik ölçeği kullanılarak ölçeklenir ve yükseklik yükseklik ölçeği kullanılarak ölçeklenir, sonuç şu şekildedir:

  • x = orijinalX * 1.5 = 75
  • y = orijinalY * 1.666 .. (Dönem) = 83.333 ... (Dönem)

Böylece yeni ekran boyutları ve ölçeklendirilmiş x / y koordinatları:

  • genişlik = 150
  • yükseklik = 250
  • x = 75
  • y = 83.333 ... (Dönem)

Uzun bir hikaye kısaltmak için, bitmap'leri ölçeklendirme algoritması:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate

Oyunum, SurfaceHolder.Callback'i genişleten bir oyun paneli kullanıyor (Etkinlik tarafından çağrılan bir XML dosyasında). Bu sorunun bir parçası olabilir mi?
user1404512

@ user1404512 Bir SurfaceHolder.Callback genellikle bir SurfaceView ile bağlantılıdır - ve aynı zamanda A SurfaceHolder.Callback'inizde başka bir Layout'a (FrameLayout vb.) gömülü ise SurfaceView'un nasıl yapılandırıldığına (genişlik / yükseklik) bağlıdır. bir yöntem olmalıdır: genel void surfaceChanged (SurfaceHolder tutucu, int biçimi, int genişliği, int yüksekliği) genişlik ve yükseklik, ekranda çizilenlerin boyutu olmalıdır - ki bu durumda tabletlerde ve akıllı telefonlarda aynı olur - bunu doğruladın mı?
AgentKnopf

Evet, sanırım şunu söylemeliyim: Ekran boyutu daha büyük olmasına rağmen tabletimde çalıştırdığımda tüm bitmap'ler aynı boyutta. Bitmap'lerin farklı boyut ekranlarında bile aynı oranda kalmasını sağlamanın bir yolu var mı?
user1404512

@ user1404512 Size sorduğumuz tüm bu soruları yanıtlamanız gerçekten önemlidir, çünkü düzeninizin nasıl tasarlandığına dair hala karanlıktayız, bu da belirli bir soruyu cevaplamayı zorlaştırır. Bitmap'lerinize gelince: Kurulumunuz hakkında çok az şey bilindiği için bitmap ölçeklendirme sorusunu cevaplayabileceğim en iyi yanıtı verdim.
AgentKnopf

Hayır, oyun motoru kullanmıyorum. Düzenimi xml içinde var ve xml dosyamda tüm ekran bir SurfaceHolder.Callback var. Tutucunun genişliği ve yüksekliği ekrandan ekrana değişir. Benim sorunum X ve Y koordinatları ile bitmapler çiziyorum, ama bitmap ölçeği ekrandan ekrana aynı kalır düşünüyorum. Bunu düzeltmenin bir yolu var mı? Şimdiden çok teşekkürler!
user1404512

3

Android.com'da iyi ve alakalı bir makale var: http://developer.android.com/guide/practices/screens_support.html

Bu referans, ekran boyutu, ekran yoğunluğu ve çözünürlük arasında sıralama yapmanıza yardımcı olur. Amaç, kullanıcı arayüzü bileşenlerinizin ve grafiklerinizin çeşitli cihazlarda iyi görünebilmesi için "yoğunluk bağımsızlığı" elde etmek için Android API'larını kullanmaktır.

Düzeni ve görünümü test ederken öykünücü için farklı Android Sanal Aygıt yapılandırmaları oluşturabileceğinizi unutmayın: http://developer.android.com/guide/developing/devices/emulator.html


0

Sadece karanlıkta bir atış. Ana düzeni dikey ve yatay olarak dolduracak ana düzeni belirlediniz mi?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.