2010-09-03 12 views
8

Mi aplicación para Android (un juego basado en texto) usa mucho las imágenes de fondo para proporcionar un mejor ambiente visual. Por ejemplo, si la acción en el juego te lleva a una taberna, obtienes una imagen de fondo de una taberna en el juego. Esta es una gran mejora, gráficamente, sobre el aburrido fondo negro que de otra manera obtendrías.Manejo de diferentes resoluciones de pantalla para imágenes de fondo en Android

También es un problema, sin embargo, desde android: el fondo siempre se extiende a las dimensiones de la pantalla. El resultado es que las imágenes de fondo se ven muy mal si el reproductor cambia entre el modo retrato y paisaje. Y para empeorar las cosas, muchos dispositivos tienen relaciones de aspecto muy diferentes (por ejemplo, 320x480 mdpi, 480x800 hdpi y 480x852 hdpi) y aún vienen más variaciones.

¿Cómo otros solucionan este problema? Tener imágenes individuales para las resoluciones/orientaciones principales no es una opción para mí, ya que esto daría como resultado que la aplicación crezca demasiado.

+0

Gracias por la respuesta. Lamento que solo pueda marcar uno de ustedes. :) –

+0

Romain proporcionó otra respuesta útil en http://stackoverflow.com/questions/3944080/android-avoid-scaling-of-background –

Respuesta

2

Le sugiero que obtenga el ancho y el alto de su vista actual. En este momento no estoy seguro de qué funciones le darán estos valores, pero estoy seguro de que es posible. Con eso puedes calcular una relación de aspecto. Haría las imágenes algo así como 1000x1000 y solo mostraría una cierta parte de la imagen, para que la relación de aspecto no sea incorrecta.
Tengo el mismo problema con la cámara. Así que mi solución fue elegir uno de los dos valores, ancho o alto, como fijo, y calcular el otro valor correcto de acuerdo con la relación de aspecto. No estoy seguro de si ya hay funciones para mostrar una parte de la imagen, pero estoy seguro de que podría escribir algo para copiar solo una parte de la imagen y mostrar esa parte.

El inconveniente es, por supuesto, que solo mostrará una parte del fondo. Dado que la relación de aspecto general de los teléfonos está entre 1: 1.3 y 1: 1.8, supongo que no sería un problema demasiado grande. Por mi parte, preferiría ver la parte de una imagen de la manera correcta, que mirar una imagen estirada fea.

2

¿Tal vez podría crear sus imágenes de fondo como imágenes NinePatch para que tenga un mejor control de cómo se estira?

De lo contrario, puede evitar que las imágenes se estiren (o al menos mantener la relación de aspecto correcta) configurando el atributo scaleType, p. Ej. android:scaleType="center".

5

El primer paso es obtener la altura y el ancho de la pantalla del dispositivo, luego estirar/contraer o rellenar el mapa de bits según sea necesario. Este SO answer tiene una fuente que debería ayudar, copiada a continuación. Apoyos a Josef para una respuesta original.

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

Aquí hay una fuente genérica para obtener la orientación.

int orientation = display.getOrientation(); 

o alguna fuente más complicado de here (un poco desordenado pero parece correcta).

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 
} 
Cuestiones relacionadas