2010-09-03 10 views
8

Meine Android-App (ein textbasiertes Spiel) verwendet Hintergrundbilder viel, um eine bessere visuelle Atmosphäre zu bieten. Zum Beispiel, wenn die Aktion im Spiel Sie in eine Taverne führt, dann erhalten Sie ein Hintergrundbild einer Taverne im Spiel. Dies ist eine enorme Verbesserung, grafisch, über den langweiligen schwarzen Hintergrund, den Sie sonst bekommen würden.Umgang mit verschiedenen Bildschirmauflösungen für Hintergrundbilder in Android

Es ist aber auch ein Problem, da Android: Hintergrund erstreckt sich immer auf die Abmessungen des Bildschirms. Die Folge ist, dass die Hintergrundbilder sehr schlecht aussehen, wenn der Player zwischen Hoch- und Querformat wechselt. Und um die Sache noch schlimmer zu machen, haben viele Geräte sehr unterschiedliche Seitenverhältnisse (z. B. 320 × 480 dpi, 480 × 800 hdpi und 480 × 852 hdpi) und noch mehr Variationen kommen.

Wie lösen andere dieses Problem? Einzelne Bilder für die Hauptauflösungen/-orientierungen zu haben, ist für mich keine Option, da dies dazu führen würde, dass die APK zu groß wird.

+0

Danke für die Antworten. Entschuldigung, dass ich nur einen von Ihnen ankreuzen kann. :) –

+0

Romain lieferte eine weitere nützliche Antwort in http://stackoverflow.com/questions/3944080/android-avoid-scaling-of-background –

Antwort

2

Ich würde vorschlagen, Sie erhalten die Breite und Höhe Ihrer aktuellen Ansicht. Im Moment bin ich nicht sicher, welche Funktionen Ihnen diese Werte geben werden, aber ich bin mir sicher, dass es möglich ist. Damit können Sie dann ein Seitenverhältnis berechnen. Ich würde die Bilder zu etwas wie 1000x1000 machen und nur einen bestimmten Teil des Bildes zeigen, so dass das Seitenverhältnis nicht falsch ist.
Ich habe das gleiche Problem mit der Kamera. Meine Lösung bestand also darin, einen der beiden Werte, Breite oder Höhe, als fest zu wählen und den korrekten anderen Wert entsprechend dem Seitenverhältnis zu berechnen. Ich bin nicht sicher, ob es bereits Funktionen gibt, die nur einen Teil des Bildes zeigen, aber ich bin mir sicher, dass Sie etwas schreiben könnten, um nur einen Teil des Bildes zu kopieren und diesen Teil zu zeigen.

Der Nachteil ist natürlich, dass Sie nur einen Teil des Hintergrunds zeigen. Da das allgemeine Seitenverhältnis der Telefone jedoch irgendwo zwischen 1: 1,3 und 1: 1,8 liegt, wäre das wohl kein allzu großes Problem. Ich für meinen Teil würde den Teil eines Bildes lieber auf die richtige Weise sehen, als auf ein hässliches Bild zu schauen.

2

Vielleicht könnten Sie Ihre Hintergrundbilder als NinePatch Bilder erstellen, so dass Sie besser kontrollieren können, wie es dehnt?

Andernfalls können Sie verhindern, dass Ihre Bilder gestreckt werden (oder zumindest das korrekte Seitenverhältnis beibehalten), indem Sie das Attribut z. android:scaleType="center".

5

Der erste Schritt besteht darin, die Bildschirmhöhe und -breite des Geräts selbst zu ermitteln, dann die Bitmap nach Bedarf zu dehnen/verkleinern oder aufzufüllen. Dieses SO answer hat Quelle, die helfen sollte, kopiert unten. Requisiten zu Josef für ursprüngliche Antwort.

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight(); 

Hier ist allgemeine Quelle für die Orientierung.

int orientation = display.getOrientation(); 

oder einige mehr beteiligt Quelle von here (ein wenig chaotisch, aber sieht richtig).

public int getscrOrientation() 
{ 
    Display getOrient = getWindowManager().getDefaultDisplay(); 

    int orientation = getOrient.getOrientation(); 

    // Sometimes you may get undefined orientation Value is 0 
    // simple logic solves the problem compare the screen 
    // X,Y Co-ordinates and determine the Orientation in such cases 
    if(orientation==Configuration.ORIENTATION_UNDEFINED){ 

     Configuration config = getResources().getConfiguration(); 
     orientation = config.orientation; 

     if(orientation==Configuration.ORIENTATION_UNDEFINED){ 
     //if height and widht of screen are equal then 
     // it is square orientation 
      if(getOrient.getWidth()==getOrient.getHeight()){ 
      orientation = Configuration.ORIENTATION_SQUARE; 
      }else{ //if widht is less than height than it is portrait 

       if(getOrient.getWidth() < getOrient.getHeight()){ 
       orientation = Configuration.ORIENTATION_PORTRAIT; 
       }else{ // if it is not any of the above it will defineitly be landscape 
       orientation = Configuration.ORIENTATION_LANDSCAPE; 
       } 
      } 
     } 
    } 
    return orientation; // return value 1 is portrait and 2 is Landscape Mode 
} 
Verwandte Themen