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