Adattamento del gioco Android a schermi di dimensioni diverse


11

Sto realizzando un gioco per Android che è solo in orientamento verticale. Funziona benissimo quando lo eseguo sul mio telefono, ma quando lo eseguo su un tablet, anche se le dimensioni dello schermo sono più grandi, tutte le bitmap hanno le stesse dimensioni. Esiste un modo per mantenere le bitmap nella stessa proporzione anche su schermi di dimensioni diverse?

Risposte:


11

A meno che tu non stia usando AbsoluteLayout (di solito è una pessima idea, mentre progetti il ​​layout usando le coordinate x / y, che si adattano solo al dispositivo su cui è stato progettato), ciò non dovrebbe accadere - le applicazioni Android si adattano automaticamente alle dimensioni dello schermo del dispositivo . Tuttavia, da quello che descrivi (il layout non si adatta allo schermo della tabella), sembra che AbsoluteLayout potrebbe essere il problema qui.

Assicurati che nei tuoi file XML di layout NON stai utilizzando layout assoluti (questo include l'impostazione di coordinate / larghezze / altezze esplicite su qualsiasi tipo di vista). Invece considera l'utilizzo di:

... qualunque cosa si adatti meglio al tuo scopo.

Se non conosci Android , Google offre un simpatico tutorial che introduce ai diversi tipi di layout sopra menzionati. Altre esercitazioni sono disponibili qui .

Inoltre, il tuo livello API sarebbe pertinente (per sapere se stai utilizzando Android 2.xo 4.x - non presumo 3.x poiché non è disponibile per gli smartphone) per capire la causa del problema.

Stai forzando la tua applicazione in modalità Ritratto impostando:

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

... nella tua attività che mostra le visualizzazioni del gioco?

Fornisci maggiori informazioni su come stai layout le tue visualizzazioni (stai usando XML per il layout che successivamente gonferai nella tua attività, o stai utilizzando il layout in-code nella tua attività ecc ....)? Inoltre: hai provato a far funzionare la tua app in uno smartphone e in un emulatore di dimensioni tablet? In caso affermativo, il problema persiste?


AGGIORNAMENTO: COME SCALARE I bitmap

L'OP ha chiesto come può ridimensionare le bitmap che sta usando nel suo gioco. Un'opzione (da tutto ciò che so sulla configurazione dell'OP): SurfaceHolder.Callback che stai sostituendo per visualizzare il tuo gioco e su cui esegui il rendering di tutte le bitmap ecc ... ha un metodo chiamato:

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

Questo metodo ti dà la larghezza / altezza della tua superficie, quindi ora puoi usare:

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

dalla classe Bitmap . Per ridimensionare le immagini in proporzione alla dimensione della superficie su cui stai disegnando.

Quello che devi fare è questo: se conosci le dimensioni della tua bitmap in relazione a una determinata dimensione dello schermo, ad esempio le dimensioni dello schermo del tuo smartphone. Quindi è possibile calcolare le dimensioni target delle bitmap ridimensionate. Ecco la matematica (racchiusa in un esempio):

Supponi di avere una Bitmap A con le dimensioni 25x50 (larghezzaxheight) che viene visualizzata su uno schermo con le dimensioni 100x200 (larghezzaxheight). Per quella dimensione dello schermo (100x200) la bitmap ha le dimensioni corrette - ora se si desidera visualizzare la bitmap su uno schermo più grande è necessario:

  • Calcola il fattore di scala per la dimensione della bitmap
  • Mantieni le proporzioni della bitmap (in modo che non venga distorta)

Supponiamo che lo schermo più grande sia 200x300 (larghezza x altezza), quindi il fattore di scala per la larghezza è:

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

Quindi 2 è il nostro fattore di scala per il valore di larghezza e altezza della bitmap, poiché dobbiamo mantenere le proporzioni della bitmap, possiamo semplicemente moltiplicare il fattore di scala per la larghezza e l'altezza della bitmap:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

Quindi, usando la nostra bitmap di esempio A dall'alto e la formula menzionata, le nuove dimensioni della bitmap sarebbero: 50x100 (larghezza x altezza) perché:

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

Ora che conosciamo le nuove dimensioni della nostra bitmap, utilizziamo semplicemente la chiamata API che ho menzionato sopra e riempiamo gli spazi vuoti:

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

myBitmap nell'esempio sopra è la bitmap A originale che aveva le dimensioni 25x50 ed è ridimensionata su 50x100 usando lo snippet di codice sopra riportato.


Tuttavia , ciò non risolve il problema originale dell'applicazione occupando solo l'angolo in alto a destra di un dispositivo tablet. Per rispondere a quello avremmo bisogno di risposte alle domande che ti abbiamo posto riguardo alla tua configurazione. Li riassumerò rapidamente qui:

  • Stai utilizzando un motore di gioco come AndEngine o Unity ?
  • Stai scrivendo il tuo layout in XML? Se sì, qual è il layout di root per il rendering dei contenuti del tuo gioco?
  • Hai detto che stai implementando SurfaceHolder.Callback? La larghezza / altezza fornita nella chiamata del metodo di surfaceChanged ti dà la dimensione della superficie - è la stessa dimensione quando l'app viene eseguita su uno smartphone o un tablet?
  • Hai accesso a SurfaceView (o qualunque cosa sia collegata a quel SurfaceHolder. Callback che stai implementando), così potremmo determinare se è quello che imposta rigidamente le dimensioni dell'app alle dimensioni dello smartphone.
  • Gli stessi problemi di ridimensionamento si verificano nell'emulatore con diverse risoluzioni dello schermo?

Un sospetto generale: non tutti gli smartphone hanno le stesse dimensioni dello schermo, infatti esiste una vasta gamma di dimensioni dello schermo, il che mi fa meravigliare: hai mai testato la tua app su uno smartphone con una dimensione dello schermo diversa da quella dello schermo? Perché - il fatto che si adatti al tuo schermo, ma non a un tablet, mi fa chiedere chi imposta quelle dimensioni e quando. Perché dubito che un'app possa adattarsi a tutte le dimensioni dello schermo dello smartphone, ma non alle dimensioni del tablet - non avrà molto senso (perché hanno più o meno lo stesso core Android in esecuzione su di loro, alcune differenze tra sx, 3. xe 4.x a parte) A MENO CHE tu non stia utilizzando un framework che non supporta (per qualsiasi motivo - forse dovresti acquistare un supporto per tablet extra o altro) dimensioni dello schermo di dimensioni tablet. Ecco perché è davvero importante sapere se l'app si ridimensiona correttamente solo sul tuo telefono, o anche su altri smartphone. L'unico modo in cui sono a conoscenza di come un'app può essere limitata alle dimensioni dello schermo di un telefono specifico è utilizzando AbsoluteLayout e dimensioni generalmente assolute per i widget, ecc ...


AGGIORNAMENTO: ridimensionamento delle coordinate x / y

Per adattare la posizione della tua bitmap alle dimensioni dello schermo, qualcosa di simile al seguente dovrebbe fare il lavoro:

  • Dimensioni dello schermo: 100/200 (larghezza / altezza)
  • Posizione bitmap: x = 50 / y = 100

Ora, se aumenti le dimensioni dello schermo, dovresti ridimensionare quei valori x / y lungo:

  • Dimensioni dello schermo: 200/400 (larghezza / altezza)

Il fattore di scala sarebbe 2, poiché la larghezza e l'altezza aumentano ugualmente di due. Quindi le dimensioni sarebbero ...

  • Posizione bitmap: x = 100 / y = 200

Un altro tentativo - questa volta con diversi fattori di scala per larghezza / altezza

  • Dimensioni dello schermo: 100/150 (larghezza / altezza)
  • Posizione bitmap: x = 50 / y = 50

Se la nuova schermata target è 150/250, i calcoli sono:

  • Fattore di scala per larghezza = targetWidth / originalWidth = 1.5
  • Fattore di scala per altezza = targetHeight / originalHeight = 1.666 ... (Periodo)

Ora dobbiamo ridimensionare le coordinate x / y, x viene ridimensionato utilizzando la scala di larghezza e l'altezza viene ridimensionata utilizzando la scala di altezza, ecco il risultato:

  • x = originaleX * 1,5 = 75
  • y = originaleY * 1.666 .. (Periodo) = 83.333 ... (Periodo)

Quindi le nuove dimensioni dello schermo e le coordinate in scala x / y sono:

  • larghezza = 150
  • altezza = 250
  • x = 75
  • y = 83.333 ... (Periodo)

Per farla breve, l'algoritmo per il ridimensionamento delle bitmap è:

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

Il mio gioco utilizza un pannello di gioco che estende SurfaceHolder.Callback (è in un file XML che viene chiamato da un'attività). Questo potrebbe essere parte del problema?
user1404512

@ user1404512 Un SurfaceHolder.Callback è generalmente collegato a un SurfaceView - e dipende anche da come è configurato SurfaceView (larghezza / altezza) se è incorporato in un altro layout (come FrameLayout ecc.) ... nel tuo A SurfaceHolder. dovrebbe essere un metodo: vuoto pubblico surfaceChanged (supporto SurfaceHolder, formato int, larghezza int, altezza int) la larghezza e l'altezza dovrebbero essere le dimensioni di ciò che viene disegnato sullo schermo - che nel tuo caso sarebbe lo stesso su tablet e smartphone - può lo verifichi?
AgentKnopf,

Sì, penso che dovrei dire questo: quando lo eseguo sul mio tablet, anche se le dimensioni dello schermo sono più grandi, tutte le bitmap hanno le stesse dimensioni. Esiste un modo per mantenere le bitmap nella stessa proporzione anche su schermi di dimensioni diverse?
user1404512

@ user1404512 È davvero importante che tu risponda a tutte quelle domande che ti abbiamo posto, perché siamo ancora un po 'al buio su come è progettato il tuo layout, il che rende difficile rispondere a qualsiasi domanda specifica. Per quanto riguarda le tue bitmap: ho aggiornato la mia risposta per rispondere al meglio alla domanda di ridimensionamento bitmap, dato che si sa molto poco sulla tua configurazione.
AgentKnopf,

No, non sto usando un motore di gioco. Ho il mio layout in XML e nel mio file XML ho un SurfaceHolder.Callback che è l'intero schermo. La larghezza e l'altezza del supporto cambiano da schermo a schermo. Penso che il mio problema sia che sto disegnando le bitmap con coordinate X e Y, ma la scala delle bitmap rimane la stessa da uno schermo all'altro. C'è un modo per risolvere questo problema? Grazie mille in anticipo!
user1404512

3

C'è un articolo valido e pertinente su Android.com: http://developer.android.com/guide/practices/screens_support.html

Questo riferimento consente di ordinare in base a dimensioni, densità e risoluzione dello schermo. L'obiettivo è utilizzare le API Android per ottenere "l'indipendenza dalla densità" in modo che i componenti e la grafica dell'interfaccia utente possano apparire belli su vari dispositivi.

Ricorda che puoi anche creare diverse configurazioni di dispositivi virtuali Android per l'emulatore mentre stai testando il layout e l'aspetto: http://developer.android.com/guide/developing/devices/emulator.html


0

Solo uno scatto nel buio qui. Hai impostato il layout principale per riempire il genitore sia in verticale che in orizzontale?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.