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:
... 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