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