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
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
źródło
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?
źródło