2010-04-14 13 views
39

Sono confuso riguardo le densità. Vedo che con densità media, la risoluzione dello schermo potrebbe essere 320x480, 480x800 o 480x854. Quindi, se ho un'immagine che è larga 300 px nella cartella mdpi, come avrà le stesse dimensioni su tutte e 3 le diverse dimensioni dello schermo (principalmente 320x480 rispetto agli altri 2)? E con la stessa dimensione, intendo la scala per essere più grande o più piccola a seconda delle dimensioni dello schermo. Grazie.Dimensioni dello schermo multiplo Android con la stessa densità

+1

http://androidtrainningcenter.blogspot.in/2012/01/plan-design-in-best-way-for-multiple.html visitare questo link – Sameer

risposta

67

Ci sono tre concetti distinti ma collegati da comprendere qui: densità dello schermo (pixel per pollice/centimetro, o comunemente noto come DPI da punti per pollice nelle stampanti), dimensioni dello schermo fisico (in pollici o centimetri) e numero di pixel (noto anche come risoluzione, in pixel).

Questi termini sono non intercambiabili e è necessario comprendere in che modo si collegano tra loro per non essere confusi con il problema. In genere, puoi ignorare le dimensioni dello schermo fisico poiché ciò è già considerato nella densità. Ad esempio uno schermo di 3 pollici di larghezza e 300 pixel di larghezza avrà un DPI di 100. Inoltre, le schermate dei telefoni tendono ad avere circa la stessa dimensione fisica, anche se il numero di pixel è molto diverso.

Quindi, prendiamo in considerazione lo schermo di un G1 o Hero che ha una risoluzione 480x320 e una densità di circa 160 dpi. Un'immagine di 300 pixel di larghezza sarà di 1,875 pollici di diametro. Questo è calcolato in base alla dimensione dei pixel (300)/densità (160). Ora, se si confronta questo sullo schermo del Nexus One, Droid o simili, questi modelli hanno uno schermo con una risoluzione maggiore di circa 800x480 con un'alta densità di circa 240 dpi. Se visualizzi la stessa immagine a 300px, ora verrà visualizzata fisicamente a circa un pollice e uno di larghezza. In altre parole, sarà molto più piccolo. Questo può essere un problema perché se l'immagine contiene del testo, il testo potrebbe non essere più leggibile.

Android può dire di ridimensionare automaticamente le immagini per adattarle a questi diversi schermi in modo che sembrino ancora delle stesse dimensioni. Questo viene fatto impostando le dimensioni in pixel indipendenti dalla densità. Se qualcosa è largo 100dp, sarà largo 100px su uno schermo a media densità. Su uno schermo ad alta densità, sarà largo 150 px, ma entrambi avranno le stesse dimensioni sullo schermo reale. Tuttavia, se lo fai, la tua immagine può risultare un po 'sfocata. È lo stesso di quando si ingrandisce una foto troppo da vicino in un programma di visualizzazione di immagini; i bordi diventano sfocati poiché li "allunga" mentre si esegue lo zoom.

Il modo per risolvere questo è utilizzare le cartelle mdpi, hdpi e così via. Stai dando ad Android un'immagine che è già stata ridimensionata, in modo che non debba farlo da sola. Ovviamente se si allunga l'immagine da soli in Photoshop, allora non sembrerà migliore. Ma normalmente si stanno ridimensionando le immagini molto grandi per adattarle allo schermo mobile. In tal caso, li ridimensiona tre volte, ognuno in una risoluzione diversa.

Quindi, per rispondere alla domanda specifica: se si dispone di un'immagine inserita nella cartella mdpi, avrà esattamente le stesse dimensioni indipendentemente dalla risoluzione dello schermo, purché abbiano la stessa densità. Ciò che cambierà sarà quanto spazio intorno ad essi, ad es. Un'immagine larga 320x320px riempirebbe la maggior parte di uno schermo 320x480, ma solo circa un terzo di uno schermo 480x800. Tuttavia, come notato sopra, in genere i telefoni con risoluzione più alta hanno anche uno schermo più denso. In tal caso, Android non guarderà nella tua cartella mdpi per l'immagine - andrà nella cartella hdpi, e se non la trova lì, prenderà la cartella "drawable" predefinita. Quindi se hai usato DP lo ridimensionerà automaticamente, o se hai usato PX, lo lascerà così com'è, e sembrerà solo più piccolo.

Là! Una risposta molto lunga per te. Spero che abbia senso.

+0

come distinguere gli schermi 480X800 e 480X854. abbiamo un'opzione per mettere l'immagine nella cartella hdpi. Nel mio caso l'immagine 480X800 non supporta l'immagine 480X854.Qualunque idea? – Praveen

+2

@Praveen Chandrasekaran: Per quanto ne so, non è possibile distinguere tra i due facendo affidamento sulla cartella hdpi, ma è normale. Entrambi gli schermi avranno probabilmente la stessa densità. Tuttavia, è possibile ottenere le dimensioni dello schermo a livello di programmazione. Vedi la classe Display Metrics (http://developer.android.com/reference/android/util/DisplayMetrics.html) Questo è un modo molto più affidabile per farlo - la densità di uno schermo è indipendente dal suo numero di pixel. Ad esempio, non c'è una ragione assoluta per cui uno schermo non possa avere un'alta densità e avere solo 480x320 pixel. –

+0

"Un'immagine di 300 pixel di larghezza sarà di 1,875 pollici di diametro, calcolata in base alla dimensione dei pixel (300)/densità (240)" il 240 dovrebbe essere 160 secondo la frase prima di –

4

Quindi, se ho un'immagine questo è 300px di larghezza nella cartella MDPI, come sta andando a cercare le stesse dimensioni su tutti e 3 diverse dimensioni schermo (principalmente 320x480 vs l' altro 2)?

L'aspetto dell'immagine, fisicamente, è determinato dalla densità dello schermo, non dalle dimensioni dello schermo. La tua cartella -mdpi non è legata alle dimensioni dello schermo: è legata alla densità dello schermo.

2

Potrebbe confermare la formula per il calcolo della densità dello schermo?

Come ho letto, il seguente è la formula:

Densità = SQRT (wp^2 + CV^2)/dimensione schermo

wp -> larghezza dello schermo (in px) hp -> altezza dello schermo (in px) dimensione dello schermo -> dimensione fisica dello schermo (pollici diagonale)

dimensione dello schermo (320x480) = SQRT (102400 + 230400)/160 = 3,6 pollici

dimensioni dello schermo (480x800) = SQRT (640000 + 230400)/160 = 5,8 pollici

dimensione dello schermo (480x854) = SQRT (729.316 + 230400)/160 = 6,12 pollici

Quindi, i layout (schermi UI) sono azionati da dimensioni dello schermo (piccole: < 3" , normali < 4 ", grande> 5") e le risorse estraibili (immagini) sono guidate dalla densità dello schermo.

E, la dimensione dell'immagine (in pixel) non cambia se la densità delle schermate (320x480, 480x800 o 480x854) è la stessa.

Potresti confermare?

Grazie, Ram

8

Per completezza, controllare anche queste opzioni per il layout di controllo:

Directory qualificazioni:

 
Size:   small, normal, large 
Density:  ldpi, mdpi, hdpi, nodpi(no auto-scale) 
Aspect ratio: long, notlong 
Orientation: land 
Uso:

res/layout/my_layout.xml    
res/layout-small/my_layout.xml  
res/layout-large/my_layout.xml  
res/layout-large-long/my_layout.xml  
res/layout-large-land/my_layout.xml  
res/drawable-ldpi/my_icon.png 
res/drawable-mdpi/dpi/my_icon.png 
res/drawable-hdpi/my_icon.png  
res/drawable-nodpi/composite.xml 

Limitare la vostra applicazione per le dimensioni dello schermo specifici (via l'AndroidManifest):

 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
... 
<supports-screens 
      android:largeScreens="true" 
      android:normalScreens="true" 
      android:smallScreens="true" 
      android:anyDensity="true" /> 
... 
</manifest>

E per livello di codice tweeking:

 
float scale = getContext().getResources().getDisplayMetrics().density; 
E non dimenticate:

 
dpi = 160; //At 160dpi 
pixels = dips * (density/dpi) 

E 'tutto in questo documento: developer.android.com:Supporting Multiple Screens

0

In realtà il codice per calcolare le dimensioni dello schermo fisico per i dispositivi è la seguente :

DisplayMetrics dm = new DisplayMetrics(); 

getWindowManager().getDefaultDisplay().getMetrics(dm); 

double x = Math.pow(dm.widthPixels/dm.xdpi,2); 

double y = Math.pow(dm.heightPixels/dm.ydpi,2); 

double screenInches = Math.sqrt(x+y); 
Problemi correlati