Autore Topic: Applicazione compatibile con tutte le risoluzioni correnti  (Letto 348 volte)

Offline Zed92

  • Utente junior
  • **
  • Post: 57
  • It's just a ride!
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2 mini
  • Sistema operativo:
    Windows 8
Applicazione compatibile con tutte le risoluzioni correnti
« il: 01 Aprile 2018, 04:20:07 CEST »
0
Salve a tutti, è mia intenzione creare un gioco/applicazione che sia graficamente compatibile con tutte le risoluzioni degli attuali smartphone/tablet in commercio.

Ho dato un occhiata ad html.it (Supporto multirisoluzione | Guida Android | Mobile | HTML.it) ed ho capito che:
- Bisogna creare varie immagini con diverse densità pixel: 120dpi, 160dpi, 240dpi, 320dpi ecc
- Bisogna posizionare le immagini in cartelle separate drawable e richiamarle da codice.

Tramite Android Studio sono risalito credo a tutte le principali risoluzioni correnti di smartphone/tablet che sono le seguenti:

Smartphone:
240*320
240*400
240*432
320*480
480*800
480*854
720*1280
768*1280
1080*1920
1440*2560
1440*2880

Tablet:
600*1024
800*1280
1200*1920
1536*2048
1600*2560
1800*2560

Dalla pagina ufficiale di developer.android.com ho letto che la densità pixel cambia in base al rapporto 1x,1.5x,2x,3x,4x.
Ho inoltre letto che la risoluzione di base è quella mdpi che ha 160dpi e in cui 1 pixel corrisponde ad 1 dpi.

Se io a questo punto scelgo una risoluzione mdpi tra quelle degli smartphone, mi accorgo fin da subito che se seguo i moltiplicatori con rapporto 1x,1.5x,2x,3x,4x, vado a coprire solamente alcune poche risoluzioni tra tutte quelle elencate.

Ad esempio con la 240*320 ottengo: 240*320, 360*480, 480*640, 720*960, 960*1280

Invece con la 240*400 ottengo: 360*600, 480*800, 720*1200, 960*1600

Da questo quindi penso di aver capito che non è possibile creare una sola versione grafica raster che sia compatibile con tutte le risoluzioni.

Ed è qui che mi sorgono un paio di domande...

Per quanto riguarda il codice, da quello che sono riuscito a comprendere, dovrei scegliere una risoluzione mdpi in cui 1 pixel corrisponde ad 1 dpi e poi realizzare tutta la app
usando come unità di misura i dpi invece che i pixel.
In questo modo credo/spero che quando la app viene eseguita con diversa densità pixel, le misure in dpi si adattino automaticamente alla schermata di gioco.
Oppure credo mi basterebbe moltiplicare le dimensioni correnti dei pixel per la densità pixel corrente.

Per quanto riguarda la questione grafica però non riesco a capire come poter procedere.

Se scegliessi di realizzare le immagini per una risoluzione tra quelle base mdpi e poi realizzassi anche tutte le altre versioni con densità pixel differenti (ldpi,hdpi,xhdpi, xxhdpi, xxxhdpi)
avrei comunque inserito nelle varie cartelle drawable immagini che siano davvero compatibli solamente con un paio delle risoluzioni elencate prima.

Questo vorrà dire ad esempio che se lo sfondo della mia app fosse realizzato con dimensioni pixel 480*800 e densità 240dpi e fosse eseguito su un dispositivo con risoluzione 480*854, la grafica verrebbe distorta di quei 54pixel aggiuntivi per intenderci.

Quindi volevo chiedervi, graficamente come dovrei muovermi per creare una applicazione compatibile con tutte le risoluzioni correnti.

Se vado a intuito credo che esista una porzione dello schermo che sia sempre visibile in tutte le diverse risoluzioni, mentre ce ne sia una esterna che sia interamente visibile solo a quei dispositivi che hanno la stessa densità pixel ma con risoluzione più alta.
Altrimenti non ho proprio idea di come possa funzionare le cosa.

Qualcuno può illuminarmi in merito?

Purtroppo non ho trovato nessuna guida che spiegasse come affrontare l'intera questione e magari indicasse da dove partire graficamente.

Offline Zed92

  • Utente junior
  • **
  • Post: 57
  • It's just a ride!
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2 mini
  • Sistema operativo:
    Windows 8
Re:Applicazione compatibile con tutte le risoluzioni correnti
« Risposta #1 il: 04 Aprile 2018, 02:22:20 CEST »
0
UP! :)

Offline Zed92

  • Utente junior
  • **
  • Post: 57
  • It's just a ride!
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2 mini
  • Sistema operativo:
    Windows 8
Re:Applicazione compatibile con tutte le risoluzioni correnti
« Risposta #2 il: 06 Aprile 2018, 15:51:17 CEST »
0
Ecco un esempio: https://preview.ibb.co/juUUnH/Senza_titolo_1.png

Se notate bene la prima immagine ha linee leggermente distorte..si nota meglio nel cerchietto

Inoltre ho un dubbio riguardante la conversione pixel per le varie risoluzioni:
Avevo pensato di convertire tutte le distanze pixel moltiplicandole sostanzialmente per la densità corrente, ovvero per i moltiplicatori 0.75,1,1.5,2,3 e 4.

Cosi facendo però mi accorgo che il problema è risolto solo su un gruppo di dispositivi.

Ad esempio se io prendo in considerazione due dispositivi con la stessa risoluzione 480*800 ma diversa densità (esempio 1x e 1.5x), ovviamente le distanze risultano differenti.

Quindi credo che sbagli formula o procedimento.  Idee?

Offline Zed92

  • Utente junior
  • **
  • Post: 57
  • It's just a ride!
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2 mini
  • Sistema operativo:
    Windows 8
Re:Applicazione compatibile con tutte le risoluzioni correnti
« Risposta #3 il: 08 Aprile 2018, 15:19:55 CEST »
0
Up! :)

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Applicazione compatibile con tutte le risoluzioni correnti
« Risposta #4 il: 10 Aprile 2018, 11:26:40 CEST »
0
Ciao Zed,
 ho dato un occhio alla documentazione android (che da quello che ho visto nel tuo post è quella su cui ti sei basata anche tu). Da quello che ho capito facendo un giro su internet, gli approcci per il disegno delle immagini possono essere fondamentalmente 3:
1) Immagini ad alta risoluzione, che vengono scalate verso la bassa; il vantaggio è che puoi avere una sola versione ma lo svantaggio è che obblighi dispositivi con schermi più piccolo, e normalmente con hardware più limitato, a scaricarsi e a lavorare con immagini grosse andando incontro a problemi di performance o quant'altro. Inoltre ti rimarrebbe il problema delle risoluzioni poco standard (vedi tuo esempio del link l'immagine 480*800 da visualizzare su un device con risoluzione 480*854)
2) Immagini studiate per le singole risoluzioni, che è l'approccio che stai usando
3) i vectordrawable, ma lasciamoli stare

Ora partiamo da qualche spunto per verificare se di quello che ho trovato/scoperto, tu hai già messo in pratica qualcosa:

1) https://gist.github.com/chandruscm/afa688262f22714eabfc1d64d389e657, qui trovi del codice di esempio che gestisce il resize delle immagini in libgdx
2) pe ri background, una tecnica usata è quella del 9-pacth, guarda qui Radley Marx › A simple guide to 9-patch for Android UI. android ha uno strumento che permette la creazione di immagini 9-pacth e qui trovi un tutorial su come usarla https://developer.android.com/studio/write/draw9patch.html
3) un' altra tecnica che ho incontrato è quella di simulare risoluzioni standard quando incontri una risoluzione non standard. Non mi ricordo come si chiama l'approccio, ma è lo stesso usato nelle televisioni per passare da 4:3 a 16:9 per esempio che porta all'impiego di bande nere riempitive. Io te 'lho spiegata un po ad cazzum, ma spero di averti dato un'idea di quello che intendo, adesso vedo se riesco trovare come si chiama questa tecnica, che sulla carta sembra fare schifo, ma sembra essere  cmq usata quindi un senso lo avrà, no?

Ultima cosa, nell'esempio che hai postato non mi torna qualcosa, mi sembra che il resize non sia avvenuto in modo uniforme, ma che sia stato fatto un resize senza mantenere le proporzioni tra altezza e larghezza; può essere che il problema sia lì?
Ciao
P