Dopasowywanie gry na Androida do różnych rozmiarów ekranu


11

Tworzę grę na Androida, która jest tylko w orientacji pionowej. Działa świetnie, gdy uruchamiam go na telefonie, ale kiedy uruchamiam go na tablecie, mimo że rozmiar ekranu jest większy, wszystkie mapy bitowe są tego samego rozmiaru. Czy jest jakiś sposób, aby mapy bitowe pozostały niezmienione nawet na ekranach o różnych rozmiarach?

Odpowiedzi:


11

O ile nie używasz AbsoluteLayout (zwykle bardzo zły pomysł, ponieważ projektujesz układ za pomocą współrzędnych x / y, które będą pasować tylko do urządzenia, na którym został zaprojektowany), to nie powinno się zdarzyć - aplikacje na Androida automatycznie dostosowują się do wielkości ekranu urządzenia . Jednak z tego, co opisujesz (układ nie dostosowuje się do ekranu tabeli), wydaje się, że problemem może być tutaj AbsoluteLayout.

Upewnij się, że w plikach XML układu NIE używasz układów bezwzględnych (obejmuje to ustawienie wyraźnych współrzędnych / szerokości / wysokości w dowolnym widoku). Zamiast tego rozważ użycie:

... cokolwiek najlepiej pasuje do twojego celu.

Jeśli dopiero zaczynasz korzystać z Androida , Google oferuje fajny samouczek przedstawiający różne typy układów wspomniane powyżej. Więcej samouczków można znaleźć tutaj .

Ponadto Twój poziom interfejsu API byłby istotny (aby wiedzieć, czy używasz Androida 2.x czy 4.x - nie zakładam, że 3.x, ponieważ nie jest dostępny dla smartfonów), aby ustalić przyczynę problemu.

Czy zmuszasz swoją aplikację do trybu pionowego, ustawiając:

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

... w Twojej aktywności, która wyświetla poglądy gry?

Podaj więcej informacji o tym, jak układasz swoje widoki (czy używasz XML do układu, który później nadmuchujesz w swoim działaniu, czy też używasz układu w kodzie w swoim działaniu itp.)? Ponadto: Czy próbowałeś uruchomić aplikację w emulatorze wielkości smartfona i tabletu? Jeśli tak, czy problem nadal występuje?


AKTUALIZACJA: JAK SKALOWAĆ BITMAPS

OP zapytał, jak może skalować bitmapę, której używa w swojej grze. Jedna opcja (z tego, co wiem o konfiguracji PO): SurfaceHolder.Callback, który zastępujesz, aby wyświetlić grę i na którym renderujesz wszystkie mapy bitowe itp. ... ma metodę o nazwie:

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

Ta metoda daje szerokość / wysokość twojej powierzchni, więc możesz teraz użyć:

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

z klasy Bitmap . Aby zmienić rozmiar zdjęć proporcjonalnie do wielkości powierzchni, na której rysujesz.

To, co musisz zrobić, to: jeśli znasz wymiary bitmapy w stosunku do danego rozmiaru ekranu, na przykład rozmiar ekranu smartfona. Następnie możesz obliczyć docelowe wymiary skalowanych bitmap. Oto matematyka (zawarta w przykładzie):

Załóżmy, że masz mapę bitową A o wymiarach 25 x 50 (szerokość x wysokość), która jest wyświetlana na ekranie o wymiarach 100 x 200 (szerokość x wysokość). Dla tego rozmiaru ekranu (100 x 200) bitmapa ma prawidłowe wymiary - teraz, jeśli chcesz wyświetlić mapę bitową na większym ekranie, musisz:

  • Oblicz współczynnik skali dla wielkości mapy bitowej
  • Zachowaj proporcje mapy bitowej (aby się nie zniekształcała)

Powiedzmy, że większy ekran ma wymiary 200 x 300 (szerokość x wysokość), a następnie współczynnik skali dla szerokości wynosi:

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

Zatem 2 jest naszym współczynnikiem skali dla wartości szerokości i wysokości mapy bitowej, ponieważ musimy zachować współczynnik proporcji mapy bitowej, możemy po prostu pomnożyć współczynnik skali przez szerokość i wysokość mapy bitowej:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

Korzystając z powyższej przykładowej mapy bitowej A i wspomnianej formuły, nowe wymiary mapy bitowej wynosiłyby: 50 x 100 (szerokość x wysokość), ponieważ:

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

Więc teraz, kiedy znamy nowy rozmiar naszej bitmapy, po prostu używamy wywołania API, o którym wspomniałem powyżej i wypełniamy puste pola:

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

myBitmap w powyższym przykładzie jest oryginalną bitmapą A, która miała wymiary 25 x 50 i jest skalowana do 50 x 100 przy użyciu powyższego fragmentu kodu.


Jednak to nie rozwiązałoby twojego pierwotnego problemu z aplikacją zajmującą tylko prawy górny róg urządzenia wielkości tabletu. Aby odpowiedzieć na to pytanie, potrzebowalibyśmy odpowiedzi na pytania, które zadaliśmy w związku z konfiguracją. Szybko je podsumuję:

  • Czy używasz silnika gry, takiego jak AndEngine lub Unity ?
  • Czy piszesz swój układ w XML? Jeśli tak, jaki jest twój układ root do renderowania zawartości twojej gry?
  • Wspomniałeś, że wdrażasz SurfaceHolder.Callback? Szerokość / wysokość podana w wywołaniu metody surfaceChanged daje rozmiar powierzchni - czy jest to ten sam rozmiar, gdy aplikacja działa na smartfonie lub tablecie?
  • Czy masz dostęp do SurfaceView (lub cokolwiek, co jest powiązane z tym SurfaceHolder.Callback, który wdrażasz), abyśmy mogli ustalić, czy to właśnie ten sztywno ustawia rozmiar aplikacji na rozmiar smartfona.
  • Czy te same problemy ze zmianą rozmiaru występują w emulatorze przy różnych rozdzielczościach ekranu?

Ogólne podejrzenie: nie każdy smartfon ma taki sam rozmiar ekranu, w rzeczywistości istnieje szeroki zakres rozmiarów ekranów, co mnie zastanawia: czy kiedykolwiek testowałeś swoją aplikację na smartfonie z innym ekranem niż ekran? Ponieważ - fakt, że pasuje do ekranu, ale nie do tabletu, sprawia, że ​​zastanawiam się, kto i kiedy określa te wymiary. Ponieważ wątpię, czy aplikacja może dostosować się do wszystkich rozmiarów ekranów smartfonów, ale nie do rozmiarów tabletów - nie ma większego sensu (ponieważ mają mniej więcej taki sam rdzeń Androida, niektóre różnice między sx, 3. x i 4.x na bok) O ile nie używasz frameworka, który nie obsługuje (z jakiegokolwiek powodu - być może będziesz musiał kupić dodatkowe wsparcie tabletu lub cokolwiek innego) rozmiary ekranu tabletu. Dlatego naprawdę ważne jest, aby wiedzieć, czy aplikacja zmienia się poprawnie tylko na telefonie, lub też na innych smartfonach. Jedyny sposób, w jaki zdaję sobie sprawę z tego, w jaki sposób można ograniczyć aplikację do rozmiaru ekranu jednego określonego telefonu, to użycie AbsoluteLayout i ogólnie bezwzględnych wymiarów widżetów itp.


AKTUALIZACJA: Skalowanie współrzędnych x / y

Aby dopasować położenie mapy bitowej do rozmiaru ekranu, należy wykonać następujące czynności:

  • Wymiary ekranu: 100/200 (szerokość / wysokość)
  • Lokalizacja bitmapy: x = 50 / y = 100

Teraz, jeśli zwiększysz rozmiar ekranu, będziesz musiał przeskalować te wartości x / y wzdłuż:

  • Wymiary ekranu: 200/400 (szerokość / wysokość)

Współczynnik skali wyniósłby 2, ponieważ szerokość i wysokość równomiernie wzrosłyby o dwa. Stąd wymiary byłyby ...

  • Lokalizacja bitmapy: x = 100 / y = 200

Kolejna próba - tym razem z różnymi współczynnikami skali dla szerokości / wysokości

  • Wymiary ekranu: 100/150 (szerokość / wysokość)
  • Lokalizacja bitmapy: x = 50 / y = 50

Jeśli nowy ekran docelowy to 150/250, wówczas obliczenia są następujące:

  • Współczynnik skali dla width = targetWidth / originalWidth = 1,5
  • Współczynnik skali dla wysokości = docelowa wysokość / oryginalna wysokość = 1,666 ... (okres)

Teraz musimy skalować współrzędne x / y, x jest skalowane za pomocą skali szerokości, a wysokość jest skalowana za pomocą skali wysokości, oto wynik:

  • x = oryginał X * 1,5 = 75
  • y = oryginał Y * 1,666 .. (okres) = 83,333 ... (okres)

Nowe wymiary ekranu i skalowane współrzędne x / y to:

  • szerokość = 150
  • wysokość = 250
  • x = 75
  • y = 83 333 ... (okres)

Krótko mówiąc, algorytm skalowania map bitowych jest następujący:

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

Moja gra korzysta z panelu gry, który rozszerza SurfaceHolder.Callback (znajduje się w pliku XML wywoływanym przez działanie). Czy to może być część problemu?
user1404512

@ user1404512 SurfaceHolder.Callback jest zwykle połączony z SurfaceView - i zależy również od tego, w jaki sposób SurfaceView jest skonfigurowany (szerokość / wysokość), jeśli jest osadzony w innym układzie (takim jak FrameLayout itp.) ... w twoim SurfaceHolder.Callback tam powinna być metodą: public void surfaceChanged (uchwyt SurfaceHolder, format int, int szerokość, int wysokość) szerokość i wysokość powinny być wielkościami rysowanymi na ekranie - które w twoim przypadku byłyby takie same na tabletach i smartfonach - mogą weryfikujesz to?
AgentKnopf

Tak, myślę, że powinienem powiedzieć: kiedy uruchamiam go na tablecie, mimo że rozmiar ekranu jest większy, wszystkie mapy bitowe są tego samego rozmiaru. Czy jest jakiś sposób, aby mapy bitowe pozostały niezmienione nawet na ekranach o różnych rozmiarach?
user1404512

@ user1404512 Bardzo ważne jest, abyś odpowiedział na wszystkie pytania, które ci zadaliśmy, ponieważ wciąż jesteśmy w ciemności, jeśli chodzi o sposób zaprojektowania układu, co utrudnia odpowiedź na konkretne pytanie. Co do twoich map bitowych: zaktualizowałem swoją odpowiedź, aby jak najlepiej odpowiedzieć na pytanie dotyczące skalowania map bitowych, biorąc pod uwagę, że niewiele wiadomo na temat twojej konfiguracji.
AgentKnopf

Nie, nie używam silnika gry. Mam układ w formacie xml, aw moim pliku xml mam SurfaceHolder.Callback, czyli cały ekran. Szerokość i wysokość uchwytu zmieniają się z ekranu na ekran. Myślę, że moim problemem jest to, że rysuję bitmapy ze współrzędnymi X i Y, ale skala bitmap pozostaje taka sama na ekranie. Czy jest jakiś sposób to naprawić? Z góry dziękuję!
użytkownik1404512

3

Istnieje dobry i odpowiedni artykuł na Android.com: http://developer.android.com/guide/practices/screens_support.html

Ta dokumentacja pomaga sortować według rozmiaru ekranu, gęstości ekranu i rozdzielczości. Celem jest użycie interfejsów API systemu Android w celu uzyskania „niezależności od gęstości”, aby elementy interfejsu użytkownika i grafika mogły dobrze wyglądać na różnych urządzeniach.

Pamiętaj, że podczas testowania układu i wyglądu możesz także tworzyć różne konfiguracje wirtualnych urządzeń z Androidem: http://developer.android.com/guide/developing/devices/emulator.html


0

Tylko strzał w ciemność tutaj. Czy ustawiłeś dowolny układ główny, aby wypełnić element nadrzędny zarówno w pionie, jak iw poziomie?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.