Applicazione compatibile con tutte le risoluzioni correnti

di il
10 risposte

Applicazione compatibile con tutte le risoluzioni correnti

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 (http://www.html.it/pag/50534/supporto-multirisoluzione) 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.

10 Risposte

  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    Scusami ma ti stai perdendo in un bicchiere d'acqua.
    La densità dpi non c'entra praticamente nulla col tuo problema, è data banalmente dal rapporto tra la risoluzione in pixel e la dimensione fisica dello schermo del display.

    Per una "copertura" di ogni porzione, supponendo di non voler adottare scalature, devi avere tante immagini raster quante esse sono.

    Spesso sei facilitato nel caso in cui siano multipli esatti, e tu voglia semplicemente scalare.
    Ad esempio una certa bitmap, su un display 720x1280, viene mostrata pressochè identica (sia pure in realtà "sgranata") a 1.440x2.560 (2x)

    MI pare inoltre che stai facendo un poco di confusione tra dp e dpi
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    Sono ancora confuso
    Ad esempio una certa bitmap, su un display 720x1280, viene mostrata pressochè identica (sia pure in realtà "sgranata") a 1.440x2.560 (2x)
    Fin qui sono d'accordo perchè 1.440x2.560 è esattamente 720x1280 (2x)

    Ma supponiamo io realizzi una immagine di 480*800 pixel con densità 240 e poi vado ad eseguire l'app su un dispositivo con risoluzione 480*854 e stessa densità.

    Com'è possibile che l'immagine venga mostrata pressochè identica?

    Inoltre supponiamo che io partendo da una risoluzione base di 480*800 pixel vada a realizzare tutte le altre immagini del gioco da mettere nelle varie cartelle drawable otterrei quindi le immagini per le seguenti risoluzioni: 240*400, 360*600, 480*800, 720*1200, 960*1600

    Com'è possibile ad esempio che queste immagini si vedano perfettamente su risoluzioni come 240*320, 768*1280, 1080*1920 ecc?
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    UP!
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    Conviene usare immagini ad alta risoluzione da scalare verso il basso, non a bassa risoluzione da scalare verso l'alto.

    Dpi vuol dire 'dot per inch' o, se vuoi, 'pixel per pollice'.
    Un pollice sono 2.54 cm. 240 dpi vuol dire semplicemente che hai 240 pixel ogni 2.54cm.

    Altra cosa, gli schermi attuali hanno pixel quadrati: questo vuol dire che c'e' una formula fissa che regola il numero di pixel per pollice e la dimensione dello schermo.

    Altro problema, parti dall'idea che gli schermi possono avere qualunque dimensione in orizzontale ed in verticale, ed anche qualunque dpi.

    A questo punto, un modo semplice di ragionare, e' il seguente: devi decidere se ragionare in termini di pixel o di centimetri.

    Generalmente per le immagini si ragiona in termini di pixel, ma per i caratteri in termini di cm (o mm).
    Questo perche' scalare un'immagine non e' un problema, ma i caratteri di un testo devono avere le stesse dimensioni su ogni schermo, con ogni dimensione/dpi.

    Cosi, come per i componenti dell'interfaccia utente: sempre in termini di cm/mm perche altrimenti su uno schermo a bassa risoluzione avresti componenti giganteschi e su quelli ad alta risoluzione, microscopici.

    In pratica conviene sempre ragionare in termini di cm/mm e poi fare le conversioni del caso.
    Poiche' le differenze di dimensioni tra ad esempio, 240dpi e 256dpi sono minime, android ha ragruppato le risoluzioni in un certo numero di categorie. A te basta ragionare in base al dpi di riferimento per ogni categoria
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    Ciao migliorabile

    migliorabile ha scritto:


    Conviene usare immagini ad alta risoluzione da scalare verso il basso, non a bassa risoluzione da scalare verso l'alto.
    Questo mi era già chiaro.

    migliorabile ha scritto:


    Altra cosa, gli schermi attuali hanno pixel quadrati: questo vuol dire che c'e' una formula fissa che regola il numero di pixel per pollice e la dimensione dello schermo.
    Intendi questa px = dp*(dpi/160) ?

    Cosa intendi per altri componenti dell'interfaccia utente?

    La mia app se non erro prende in modo automatico la larghezza e l'altezza delle varie immagini. Quindi in teoria dovrei solamente regolare la distanza in pixel fra di esse, e per farlo avevo pensato di partire in una risoluzione base mdpi e poi moltiplicare ogni distanza per la densità corrente.

    Per i font avevo pensato si potesse fare lo stesso ragionamento in pixel, ma se non funziona potrei fare una cosa analoga in centimetri come dici tu.

    migliorabile ha scritto:


    Poiche' le differenze di dimensioni tra ad esempio, 240dpi e 256dpi sono minime, android ha ragruppato le risoluzioni in un certo numero di categorie. A te basta ragionare in base al dpi di riferimento per ogni categoria
    Le differenza di dimensioni è vero sono minime, ma se non ho visto male dai miei test le immagini sgranano e si vede ad occhio.
    Non c'è un modo di aggirare questo problema?
    L'unica cosa che mi viene in mente a questo punto è creare vari apk e immagini grafiche, per coprire esattamente tutte le risoluzioni; ma pensavo si potesse fare diversamente.

    Ad esempio su app/giochi importanti non ho mai visto differenze grafiche tra dispositivi
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    Ecco un esempio: https://preview.ibb.co/juUUnH/Senza_titolo_1.pn

    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?
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    UP
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    UP!
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    UP!
  • Re: Applicazione compatibile con tutte le risoluzioni correnti

    Up!
Devi accedere o registrarti per scrivere nel forum
10 risposte