Adaptar el juego de Android a diferentes tamaños de pantalla


11

Estoy creando un juego de Android que solo está en orientación vertical de pantalla. Funciona muy bien cuando lo ejecuto en mi teléfono, pero cuando lo ejecuto en una tableta, a pesar de que el tamaño de la pantalla es más grande, todos los mapas de bits son del mismo tamaño. ¿Hay alguna manera de hacer que los mapas de bits se mantengan en la misma proporción incluso en pantallas de diferentes tamaños?

Respuestas:


11

A menos que esté utilizando AbsoluteLayout (por lo general, es una muy mala idea, ya que diseña su diseño utilizando coordenadas x / y, que solo se adaptarán al dispositivo en el que ha sido diseñado), esto no debería suceder: las aplicaciones de Android se ajustan automáticamente al tamaño de pantalla del dispositivo . Sin embargo, por lo que describe (el diseño no se ajusta a la pantalla de la tabla), parece que AbsoluteLayout podría ser el problema aquí.

Asegúrese de que en sus archivos XML de diseño NO esté usando diseños absolutos (esto incluye establecer coordenadas / anchos / alturas explícitas en cualquier tipo de Vista). En su lugar, considere usar:

  • LinearLayout : apila múltiples vistas horizontal o verticalmente
  • FrameLayout : generalmente contiene un hijo
  • RelativeLayout : alinee los niños entre sí
  • TableLayout : un diseño basado en tablas
  • ScrollView : puede contener un elemento secundario (como LinearLayout) y le permite desplazar su contenido

... lo que mejor se adapte a tu propósito.

Si eres nuevo en Android , Google ofrece un buen tutorial que presenta los diferentes tipos de diseño mencionados anteriormente. Más tutoriales se pueden encontrar aquí .

Además, su nivel de API sería relevante (para saber si está utilizando Android 2.xo 4.x, no supongo que 3.x ya que no está disponible para Smartphones) para averiguar la causa de su problema.

¿Está forzando su aplicación al modo vertical al configurar:

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

... en tu actividad que muestra las vistas del juego?

Proporcione más información sobre cómo está diseñando sus vistas (¿está utilizando XML para el diseño que luego inflará en su Actividad, o está usando el diseño en código en su Actividad, etc ...)? Además: ¿Intentaste ejecutar tu aplicación en un teléfono inteligente y un emulador del tamaño de una tableta? En caso afirmativo, ¿persiste el problema?


ACTUALIZACIÓN: CÓMO ESCALAR BITMAPS

El OP le preguntó cómo puede escalar los mapas de bits que está usando en su juego. Una opción (de todo lo que sé sobre la configuración del OP): SurfaceHolder. La devolución de llamada que está anulando para mostrar su juego y en la que renderiza todos los mapas de bits, etc. tiene un método llamado:

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

Ese método le proporciona el ancho / alto de su superficie, por lo que ahora podría usar:

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

de la clase Bitmap . Para cambiar el tamaño de sus imágenes en proporción al tamaño de la superficie sobre la que está dibujando.

Lo que debe hacer es esto: si conoce las dimensiones de su mapa de bits en relación con un tamaño de pantalla determinado, por ejemplo, el tamaño de la pantalla de su teléfono inteligente. Luego puede calcular las dimensiones de destino de los mapas de bits escalados. Aquí están las matemáticas (envueltas en un ejemplo):

Supongamos que tiene un mapa de bits A con las dimensiones 25x50 (ancho x alto) que se muestra en una pantalla con las dimensiones 100 x 200 (ancho x alto). Para ese tamaño de pantalla (100x200), el mapa de bits tiene las dimensiones correctas; ahora, si desea mostrar el mapa de bits en una pantalla más grande, debe:

  • Calcular el factor de escala para el tamaño del mapa de bits
  • Mantener la relación de aspecto del mapa de bits (para que no se distorsione)

Digamos que la pantalla más grande es 200x300 (ancho x alto), entonces el factor de escala para el ancho es:

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

Entonces 2 es nuestro factor de escala para el valor de ancho y alto del mapa de bits, ya que necesitamos mantener la relación de aspecto del mapa de bits, simplemente podemos multiplicar el factor de escala con el ancho y alto del mapa de bits:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

Entonces, utilizando nuestro ejemplo de mapa de bits A de arriba y la fórmula mencionada, las nuevas dimensiones del mapa de bits serían: 50x100 (ancho x alto) porque:

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

Entonces, ahora que sabemos el nuevo tamaño de nuestro mapa de bits, simplemente usamos la llamada API que mencioné anteriormente y completamos los espacios en blanco:

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

myBitmap en el ejemplo anterior es el mapa de bits A original que tenía las dimensiones 25x50 y se escala a 50x100 usando el fragmento de código anterior.


Sin embargo , esto no resolvería su problema original de que la aplicación ocupara solo la esquina superior derecha de un dispositivo del tamaño de una tableta. Para responder a eso, necesitaríamos respuestas a las preguntas que le hicimos con respecto a su configuración. Los resumiré rápidamente aquí:

  • ¿Estás utilizando un motor de juego como AndEngine o Unity ?
  • ¿Estás escribiendo tu diseño en xml? En caso afirmativo, ¿cuál es su diseño raíz para representar el contenido de su juego?
  • Usted mencionó que está implementando SurfaceHolder.Callback? El ancho / alto provisto en la llamada al método de surfaceChanged le da el tamaño de la superficie: ¿es el mismo tamaño cuando su aplicación se ejecuta en un teléfono inteligente o una tableta?
  • ¿Tiene acceso a SurfaceView (o lo que sea que esté vinculado a esa SurfaceHolder? Callback que está implementando), por lo que podríamos determinar si esa es la configuración rígida del tamaño de la aplicación en el tamaño de un teléfono inteligente.
  • ¿Se producen los mismos problemas de cambio de tamaño en el emulador con diferentes resoluciones de pantalla?

Una sospecha general: no todos los teléfonos inteligentes tienen el mismo tamaño de pantalla, de hecho, hay una amplia gama de tamaños de pantalla, lo que me hace preguntarme: ¿Alguna vez probaste tu aplicación en un teléfono inteligente con un tamaño de pantalla diferente al de tu pantalla? Porque, el hecho de que se ajuste a su pantalla, pero no a una tableta, me hace preguntarme quién establece esas dimensiones y cuándo. Porque dudo que una aplicación pueda ajustarse a todos los tamaños de pantalla de teléfonos inteligentes, pero no a los tamaños de tabletas, no tendrá mucho sentido (porque tienen más o menos el mismo núcleo de Android ejecutándose en ellos, algunas diferencias entre sx, 3). xy 4.x aparte) A MENOS QUE esté utilizando un marco que no es compatible (por cualquier razón, tal vez tendría que comprar soporte de tableta adicional o lo que sea) tamaños de pantalla del tamaño de una tableta. Por eso es realmente importante saber si la aplicación cambia el tamaño correctamente solo en su teléfono, o en otros teléfonos inteligentes también. La única forma en que soy consciente de cómo una aplicación puede limitarse al tamaño de la pantalla de un teléfono específico es mediante el uso de AbsoluteLayout y, en general, las dimensiones absolutas para widgets, etc.


ACTUALIZACIÓN: Escala de coordenadas x / y

Para ajustar la ubicación de su mapa de bits al tamaño de la pantalla, algo como lo siguiente debería hacer el trabajo:

  • Dimensiones de la pantalla: 100/200 (ancho / alto)
  • Ubicación de mapa de bits: x = 50 / y = 100

Ahora, si aumenta el tamaño de la pantalla, tendría que escalar esos valores x / y a lo largo de:

  • Dimensiones de la pantalla: 200/400 (ancho / alto)

El factor de escala sería 2, porque el ancho y la altura aumentaron igualmente en dos. Por lo tanto, las dimensiones serían ...

  • Ubicación de mapa de bits: x = 100 / y = 200

Otro intento: esta vez con diferentes factores de escala para ancho / alto

  • Dimensiones de la pantalla: 100/150 (ancho / alto)
  • Ubicación de mapa de bits: x = 50 / y = 50

Si la nueva pantalla de destino es 150/250, los cálculos son:

  • Factor de escala para ancho = targetWidth / originalWidth = 1.5
  • Factor de escala para altura = targetHeight / originalHeight = 1.666 ... (Period)

Ahora necesitamos escalar las coordenadas x / y, x se escala usando la escala de ancho y la altura se escala usando la escala de altura, aquí está el resultado:

  • x = originalX * 1.5 = 75
  • y = originalY * 1.666 .. (Periodo) = 83.333 ... (Periodo)

Entonces, las nuevas dimensiones de la pantalla y las coordenadas x / y escaladas son:

  • ancho = 150
  • altura = 250
  • x = 75
  • y = 83,333 ... (Período)

Para resumir, el algoritmo para escalar mapas de bits es:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate

Mi juego usa un panel de juego que extiende SurfaceHolder.Callback (está en un archivo XML llamado por una actividad). Podría ser esto parte del problema?
user1404512

@ user1404512 Un SurfaceHolder.Callback generalmente está vinculado a un SurfaceView, y también depende de cómo esté configurado SurfaceView (ancho / alto) si está incrustado en otro diseño (como FrameLayout, etc.) ... en su A SurfaceHolder. debe ser un método: public void surfaceChanged (soporte de SurfaceHolder, formato int, ancho int, altura int) el ancho y la altura deben ser del tamaño de lo que se dibuja en la pantalla, que en su caso sería el mismo en tabletas y teléfonos inteligentes. lo verificas?
AgentKnopf

Sí, creo que debería decir esto: cuando lo ejecuto en mi tableta, a pesar de que el tamaño de la pantalla es más grande, todos los mapas de bits son del mismo tamaño. ¿Hay alguna manera de hacer que los mapas de bits se mantengan en la misma proporción incluso en pantallas de diferentes tamaños?
user1404512

@ user1404512 Es realmente importante que conteste todas las preguntas que le hicimos, porque todavía estamos en la oscuridad en cuanto a cómo está diseñado su diseño, lo que dificulta responder una pregunta específica. En cuanto a sus mapas de bits: actualicé mi respuesta para responder a la pregunta de escala de mapa de bits lo mejor que pude, dado que se sabe muy poco sobre su configuración.
AgentKnopf

No, no estoy usando un motor de juego. Tengo mi diseño en xml, y en mi archivo xml tengo un SurfaceHolder.Callback que es toda la pantalla. El ancho y la altura del soporte cambian de una pantalla a otra. Creo que mi problema es que estoy dibujando los mapas de bits con las coordenadas X e Y, pero la escala de los mapas de bits permanece igual de pantalla a pantalla. ¿Hay alguna forma de arreglar esto? ¡Muchas gracias por adelantado!
user1404512

3

Hay un artículo bueno y relevante en Android.com: http://developer.android.com/guide/practices/screens_support.html

Esta referencia le ayuda a clasificar el tamaño de la pantalla, la densidad de la pantalla y la resolución. El objetivo es utilizar las API de Android para lograr la "independencia de densidad" para que los componentes y gráficos de la interfaz de usuario se vean bien en varios dispositivos.

Recuerde que también puede crear diferentes configuraciones de dispositivos virtuales Android para el emulador mientras prueba el diseño y la apariencia: http://developer.android.com/guide/developing/devices/emulator.html


0

Solo un tiro en la oscuridad aquí. ¿Ha configurado el diseño maestro para llenar el padre tanto vertical como horizontalmente?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.