Anpassung des Android-Spiels an verschiedene Bildschirmgrößen

11

Ich mache ein Android-Spiel, das nur im Hochformat angezeigt wird. Es funktioniert hervorragend, wenn ich es auf meinem Telefon ausführe, aber wenn ich es auf einem Tablet ausführe, sind alle Bitmaps gleich groß, obwohl der Bildschirm größer ist. Gibt es eine Möglichkeit, die Bitmaps auch auf Bildschirmen unterschiedlicher Größe im gleichen Verhältnis zu halten?

user1404512
quelle

Antworten:

11

Es sei denn, Sie verwenden Dies sollte nicht passieren, es sei AbsoluteLayout (normalerweise eine sehr schlechte Idee, da Sie Ihr Layout mit x / y-Koordinaten entwerfen, die nur für das Gerät geeignet sind, auf dem es entwickelt wurde). Android-Anwendungen passen sich automatisch an die Bildschirmgröße des Geräts an . Nach dem, was Sie beschreiben (Layout passt sich nicht an den Tabellenbildschirm an), scheint AbsoluteLayout hier das Problem zu sein.

Stellen Sie sicher, dass Sie in Ihren Layout-XML-Dateien KEINE absoluten Layouts verwenden (dazu gehört das Festlegen expliziter Koordinaten / Breiten / Höhen für jede Art von Ansicht). Verwenden Sie stattdessen:

  • LinearLayout - mehrere Ansichten horizontal oder vertikal
  • FrameLayout - Enthält normalerweise ein Kind
  • RelativeLayout - Richten Sie Kinder relativ zueinander aus
  • TableLayout - Ein Layout
  • ScrollView - Kann ein untergeordnetes Element enthalten (z. B. ein LinearLayout) und ermöglicht das Scrollen des Inhalts

... was auch immer am besten zu Ihrem Zweck passt.

Wenn Sie Android noch nicht kennen , bietet Google ein nettes Tutorial an , in dem die verschiedenen oben genannten Layouttypen vorgestellt werden. Weitere Tutorials finden Sie hier .

Darüber hinaus wäre Ihre API-Ebene relevant (um zu wissen, ob Sie Android 2.x oder 4.x verwenden - ich gehe nicht von 3.x aus, da es für Smartphones nicht verfügbar ist), um die Ursache Ihres Problems herauszufinden.

Erzwingen Sie, dass Ihre Anwendung in den Hochformatmodus wechselt, indem Sie Folgendes einstellen:

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

... in Ihrer Aktivität, in der die Ansichten des Spiels angezeigt werden?

Bitte geben Sie weitere Informationen zum Layout Ihrer Ansichten an (verwenden Sie XML für das Layout, das Sie später in Ihrer Aktivität aufblasen, oder verwenden Sie das In-Code-Layout in Ihrer Aktivität usw.)? Außerdem: Haben Sie versucht, Ihre App auf einem Smartphone- und Tablet-Emulator auszuführen? Wenn ja, besteht das Problem weiterhin?


UPDATE: SO BALDIEREN SIE BITMAPS

Das OP fragte, wie er die Bitmaps skalieren könne, die er in seinem Spiel verwendet. Eine Option (soweit ich über das Setup des OP weiß): Der SurfaceHolder.Callback, den Sie überschreiben, um Ihr Spiel anzuzeigen, und auf dem Sie alle Bitmaps usw. rendern, hat eine Methode namens:

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

Diese Methode gibt Ihnen die Breite / Höhe Ihrer Oberfläche an, sodass Sie jetzt Folgendes verwenden können:

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

aus der Bitmap-Klasse . So ändern Sie die Größe Ihrer Bilder proportional zur Größe der Oberfläche, auf die Sie zeichnen.

Was Sie tun müssen, ist Folgendes: Wenn Sie die Abmessungen Ihrer Bitmap in Bezug auf eine bestimmte Bildschirmgröße kennen, z. B. die Bildschirmgröße Ihres Smartphones. Anschließend können Sie die Zieldimensionen der skalierten Bitmaps berechnen. Hier ist die Mathematik (in ein Beispiel gehüllt):

Angenommen, Sie haben eine Bitmap A mit den Abmessungen 25 x 50 (Breite x Höhe), die auf einem Bildschirm mit den Abmessungen 100 x 200 (Breite x Höhe) angezeigt wird. Für diese Bildschirmgröße (100 x 200) hat die Bitmap die richtigen Abmessungen. Wenn Sie die Bitmap jetzt auf einem größeren Bildschirm anzeigen möchten, müssen Sie:

  • Berechnen Sie den Skalierungsfaktor für die Bitmap-Größe
  • Behalten Sie das Seitenverhältnis der Bitmap bei (damit es nicht verzerrt wird)

Angenommen, der größere Bildschirm ist 200 x 300 (Breite x Höhe), dann ist der Skalierungsfaktor für die Breite:

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

So 2 ist unser Maßstab-Faktor für die Breite und Höhe Wert der Bitmap, da wir das Seitenverhältnis der Bitmap, können wir einfach multiplizieren der Skalierungsfaktor mit der Breite und Höhe der Bitmap beibehalten müssen:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

Wenn Sie also unsere Beispiel-Bitmap A von oben und die erwähnte Formel verwenden, lauten die neuen Dimensionen der Bitmap: 50 x 100 (Breite x Höhe), weil:

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

Nachdem wir nun die neue Größe unserer Bitmap kennen, verwenden wir einfach den oben erwähnten API-Aufruf und füllen die Lücken aus:

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

myBitmap im obigen Beispiel ist die ursprüngliche Bitmap A mit den Abmessungen 25 x 50 und wird mit dem obigen Code-Snippet auf 50 x 100 skaliert.


Dies würde jedoch Ihr ursprüngliches Problem nicht lösen, dass die Anwendung nur die obere rechte Ecke eines Geräts in Tablet-Größe einnimmt. Um diese Frage zu beantworten, benötigen wir Antworten auf die Fragen, die wir Ihnen zu Ihrem Setup gestellt haben. Ich werde sie hier schnell zusammenfassen:

  • Verwenden Sie eine Game-Engine wie AndEngine oder Unity ?
  • Schreiben Sie Ihr Layout in XML? Wenn ja, wie sieht Ihr Root-Layout für das Rendern Ihrer Spielinhalte aus?
  • Sie haben erwähnt, dass Sie SurfaceHolder.Callback implementieren? Die im Methodenaufruf von surfaceChanged angegebene Breite / Höhe gibt Ihnen die Größe der Oberfläche an - ist sie dieselbe Größe, wenn Ihre App auf einem Smartphone oder Tablet ausgeführt wird?
  • Haben Sie Zugriff auf SurfaceView (oder was auch immer mit diesem SurfaceHolder.Callback verknüpft ist, den Sie implementieren), damit wir feststellen können, ob dies der Fall ist, bei dem die App-Größe starr auf die Smartphone-Größe eingestellt wird.
  • Treten im Emulator dieselben Größenänderungsprobleme mit unterschiedlichen Bildschirmauflösungen auf?

Ein allgemeiner Verdacht: Nicht jedes Smartphone hat die gleiche Bildschirmgröße, tatsächlich gibt es eine Vielzahl von Bildschirmgrößen, was mich wundert: Haben Sie Ihre App jemals auf einem Smartphone mit einer anderen Bildschirmgröße als Ihrem Bildschirm getestet? Denn - die Tatsache, dass es auf Ihren Bildschirm passt, aber nicht auf ein Tablet, lässt mich fragen, wer diese Abmessungen wann einstellt. Weil ich bezweifle, dass sich eine App an alle Smartphone-Bildschirmgrößen anpassen kann, aber nicht an Tablet-Größen - macht das nicht viel Sinn (weil auf ihnen mehr oder weniger der gleiche Android-Kern läuft, einige Unterschiede zwischen sx, 3. x und 4.x beiseite) WENN Sie kein Framework verwenden, das keine Bildschirmgrößen in Tablet-Größe unterstützt (aus welchem ​​Grund auch immer - möglicherweise müssen Sie zusätzliche Tablet-Unterstützung kaufen oder was auch immer). Aus diesem Grund ist es sehr wichtig zu wissen, ob die Größe der App nur auf Ihrem Telefon ordnungsgemäß geändert wird. oder auch auf anderen Smartphones. Ich weiß nur, wie eine App auf die Bildschirmgröße eines bestimmten Telefons beschränkt werden kann, indem ich AbsoluteLayout und im Allgemeinen absolute Abmessungen für Widgets usw. verwende.


UPDATE: Skalieren von x / y-Koordinaten

Um den Speicherort Ihrer Bitmap an die Bildschirmgröße anzupassen, sollten Sie Folgendes tun:

  • Bildschirmabmessungen: 100/200 (Breite / Höhe)
  • Bitmap-Position: x = 50 / y = 100

Wenn Sie jetzt die Bildschirmgröße erhöhen, müssen Sie diese x / y-Werte entlang skalieren:

  • Bildschirmabmessungen: 200/400 (Breite / Höhe)

Der Skalierungsfaktor wäre 2, da Breite und Höhe gleichermaßen um zwei erhöht werden. Daher wären die Dimensionen ...

  • Bitmap-Position: x = 100 / y = 200

Ein weiterer Versuch - diesmal mit verschiedenen Skalierungsfaktoren für Breite / Höhe

  • Bildschirmabmessungen: 100/150 (Breite / Höhe)
  • Bitmap-Position: x = 50 / y = 50

Wenn der neue Zielbildschirm 150/250 ist, lauten die Berechnungen wie folgt:

  • Skalierungsfaktor für width = targetWidth / originalWidth = 1.5
  • Skalierungsfaktor für Höhe = Zielhöhe / Originalhöhe = 1,666 ... (Zeitraum)

Jetzt müssen wir die x / y-Koordinaten skalieren, x wird mit der Breitenskala skaliert und die Höhe wird mit der Höhenskala skaliert. Hier ist das Ergebnis:

  • x = originalX * 1,5 = 75
  • y = originalY * 1,666 .. (Periode) = 83,333 ... (Periode)

Die neuen Bildschirmabmessungen und die skalierten x / y-Koordinaten sind also:

  • Breite = 150
  • Höhe = 250
  • x = 75
  • y = 83.333 ... (Periode)

Um es kurz zu machen, der Algorithmus zum Skalieren von Bitmaps lautet:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate
Zainodis
quelle
Mein Spiel verwendet ein Spielfeld, das SurfaceHolder.Callback erweitert (es befindet sich in einer XML-Datei, die von einer Aktivität aufgerufen wird). Könnte dies ein Teil des Problems sein?
user1404512
@ user1404512 Ein SurfaceHolder.Callback ist normalerweise mit einem SurfaceView verknüpft - und es hängt auch davon ab, wie dieses SurfaceView konfiguriert ist (Breite / Höhe), wenn es in ein anderes Layout (wie FrameLayout usw.) eingebettet ist ... in Ihrem A SurfaceHolder.Callback dort sollte eine Methode sein: public void surfaceChanged (SurfaceHolder-Halter, int-Format, int-Breite, int-Höhe) Die Breite und Höhe sollte der Größe des auf dem Bildschirm gezeichneten Objekts entsprechen - was in Ihrem Fall auf Tablets und Smartphones gleich wäre Sie überprüfen das?
AgentKnopf
Ja, ich denke, ich sollte Folgendes sagen: Wenn ich es auf meinem Tablet ausführe, sind alle Bitmaps gleich groß, obwohl der Bildschirm größer ist. Gibt es eine Möglichkeit, die Bitmaps auch auf Bildschirmen unterschiedlicher Größe im gleichen Verhältnis zu halten?
user1404512
@ user1404512 Es ist wirklich wichtig, dass Sie alle Fragen beantworten, die wir Ihnen gestellt haben, da wir immer noch im Dunkeln darüber sind, wie Ihr Layout gestaltet ist, was es schwierig macht, eine bestimmte Frage zu beantworten. Was Ihre Bitmaps betrifft: Ich habe meine Antwort aktualisiert, um die Frage zur Bitmap-Skalierung so gut wie möglich zu beantworten, da nur sehr wenig über Ihr Setup bekannt ist.
AgentKnopf
Nein, ich benutze keine Spiel-Engine. Ich habe mein Layout in XML und in meiner XML-Datei habe ich einen SurfaceHolder.Callback, der den gesamten Bildschirm darstellt. Die Breite und Höhe des Halters ändern sich von Bildschirm zu Bildschirm. Ich denke, mein Problem ist, dass ich die Bitmaps mit X- und Y-Koordinaten zeichne, aber der Maßstab der Bitmaps bleibt von Bildschirm zu Bildschirm gleich. Gibt es eine Möglichkeit, dies zu beheben? Vielen Dank im Voraus!
user1404512
3

Auf Android.com gibt es einen guten und relevanten Artikel: http://developer.android.com/guide/practices/screens_support.html

Diese Referenz hilft Ihnen beim Sortieren von Bildschirmgröße, Bildschirmdichte und Auflösung. Ziel ist es, mithilfe der Android-APIs eine "Dichteunabhängigkeit" zu erreichen, damit die Komponenten und Grafiken Ihrer Benutzeroberfläche auf verschiedenen Geräten gut aussehen.

Denken Sie daran, dass Sie beim Testen von Layout und Erscheinungsbild auch verschiedene Konfigurationen von virtuellen Android-Geräten für den Emulator erstellen können: http://developer.android.com/guide/developing/devices/emulator.html

amb
quelle
0

Nur ein Schuss in die Dunkelheit hier. Haben Sie festgelegt, wie das Master-Layout das übergeordnete Element sowohl vertikal als auch horizontal ausfüllen soll?

Derek
quelle