2010-09-03 12 views
8

Mon application Android (un jeu de texte) utilise beaucoup d'images d'arrière-plan afin de fournir une meilleure ambiance visuelle. Par exemple, si l'action dans le jeu vous emmène dans une taverne, alors vous obtenez une image de fond d'une taverne dans le jeu. C'est une grande amélioration, graphiquement, sur le fond noir ennuyeux que vous obtiendriez autrement.Traitement de différentes résolutions d'écran pour les images d'arrière-plan dans Android

C'est également un problème, cependant, puisque Android: background s'étend toujours aux dimensions de l'écran. Le résultat est que les images d'arrière-plan semblent très mauvaises si le joueur passe du mode portrait au mode paysage. Et pour aggraver les choses, de nombreux dispositifs ont des rapports d'aspect très différents (par exemple, 320 x 480 mdpi, 480 x 800 hdpi et 480 x 852 hdpi) et encore plus de variations sont à venir.

Comment les autres résolvent-ils ce problème? Avoir des images individuelles pour les principales résolutions/orientations n'est pas une option pour moi, car cela entraînerait la croissance de l'apk trop grande.

+0

Merci pour les réponses. Désolé que je ne peux que cocher l'un d'entre vous. :) –

+0

Romain fourni une autre réponse utile dans http://stackoverflow.com/questions/3944080/android-avoid-scaling-of-background –

Répondre

2

Je vous suggère d'obtenir la largeur et la hauteur de votre vue actuelle. En ce moment je ne suis pas sûr quelles fonctions vous donneront ces valeurs mais je suis sûr que c'est possible. Avec cela, vous pouvez ensuite calculer un ratio d'aspect. Je ferais les images quelque chose comme 1000x1000 et montrerais juste une certaine partie de l'image, de sorte que le rapport d'aspect ne soit pas faux.
J'ai le même problème avec l'appareil photo. Donc, ma solution était de choisir une des deux valeurs, largeur ou hauteur, comme fixe, et de calculer l'autre valeur correcte en fonction du rapport d'aspect. Je ne suis pas sûr s'il y a déjà des fonctions pour montrer juste une partie de l'image, mais je suis sûr que vous pourriez écrire quelque chose pour copier juste une partie de l'image et montrer cette partie. L'inconvénient est bien sûr que vous allez montrer juste une partie de l'arrière-plan. Depuis le rapport d'aspect général des téléphones est cependant quelque part entre 1: 1.3 et 1: 1.8 je suppose que ce ne serait pas un trop gros problème. Pour ma part, je préférerais voir la partie d'une image correctement, plutôt que de regarder une image étirée laide.

2

Peut-être pourriez-vous créer vos images de fond sous forme d'images NinePatch afin de mieux contrôler leur étirement? Sinon, vous pouvez simplement empêcher vos images de s'étirer (ou au moins conserver le bon format) en réglant l'attribut scaleType par exemple. .

5

La première étape consiste à obtenir la hauteur et la largeur de l'écran lui-même, puis à étirer/réduire ou remplir votre bitmap si nécessaire. Ce SO answer a une source qui devrait aider, copié ci-dessous. Props à Josef pour la réponse originale.

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

Voici une source générique pour obtenir l'orientation.

int orientation = display.getOrientation(); 

ou une source plus impliquée de here (un peu compliqué, mais semble correct).

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 
}