2010-04-14 12 views
39

Ich bin verwirrt in Bezug auf die Dichten. Ich sehe, dass bei mittlerer Dichte die Bildschirmauflösung entweder 320x480, 480x800 oder 480x854 betragen kann. Also, wenn ich ein Bild habe, das 300px breit im mdpi-Ordner ist, wie wird es auf allen 3 verschiedenen Bildschirmgrößen gleich aussehen (hauptsächlich 320x480 vs den anderen 2)? Und mit Blick die gleiche Größe, ich meine Maßstab größer oder kleiner je nach Bildschirmgröße. Vielen Dank.Android mehrere Bildschirmgrößen mit gleicher Dichte

+1

http://androidtrainningcenter.blogspot.in/2012/01/plan-design-in-best-way-for-multiple.html diesen Link besuchen – Sameer

Antwort

67

Es gibt drei verschiedene, aber miteinander verbundene Konzepte, die hier zu verstehen sind: Bildschirmdichte (Pixel pro Zoll/Zentimeter oder allgemein als DPI von Punkten pro Zoll in Druckern bezeichnet), physische Bildschirmgröße (in Zoll oder Zentimetern) und Anzahl der Pixel (auch bekannt als Auflösung in Pixel).

Diese Begriffe sind nicht austauschbar, und Sie müssen verstehen, wie sie miteinander verknüpfen, um nicht mit dem Problem zu verwechseln. Im Allgemeinen können Sie die physische Bildschirmgröße ignorieren, da dies bereits in der Dichte berücksichtigt wird. Beispielsweise hat ein Bildschirm mit einer Breite von 3 Zoll und einem Pixelabstand von 300 Pixeln eine DPI von 100. Darüber hinaus neigen Telefondisplays dazu, ungefähr die gleiche physikalische Größe aufzuweisen, selbst wenn die Anzahl der Pixel sehr unterschiedlich ist.

Betrachten wir den Bildschirm eines G1 oder Hero, der eine Auflösung von 480x320 und eine Dichte von ca. 160dpi hat. Ein Bild, das 300 Pixel breit ist, wird 1,875 Zoll breit sein. Dies wird anhand der Pixelgröße (300)/Dichte (160) berechnet. Wenn Sie dies nun mit dem Bildschirm des Nexus One, Droid oder ähnlichem vergleichen, haben diese Modelle einen Bildschirm mit einer höheren Auflösung von ca. 800x480 mit einer hohen Dichte von ca. 240 dpi. Wenn Sie das gleiche Bild mit einer Breite von 300 Pixeln anzeigen, wird es nur noch in etwa einem Viertel Zoll breit angezeigt. Mit anderen Worten, es wird viel kleiner sein. Dies kann ein Problem sein, denn wenn das Bild Text enthält, ist der Text möglicherweise nicht mehr lesbar.

Android kann angewiesen werden, Bilder automatisch so zu skalieren, dass sie auf diese verschiedenen Bildschirme passen, so dass sie immer noch die gleiche Größe hat. Dies wird durch Festlegen von Größen in dichteunabhängigen Pixeln erreicht. Wenn etwas 100 dpi breit ist, wird es auf einem Bildschirm mittlerer Dichte 100 Pixel breit sein. Auf einem Bildschirm mit hoher Bildschirmdichte ist es 150 Pixel breit, aber beide sehen auf dem Bildschirm ungefähr gleich aus. Wenn Sie dies jedoch tun, kann Ihr Bild ein wenig verschwommen werden. Es ist das gleiche wie wenn Sie ein Foto zu nah in ein Bildanzeigeprogramm hineinzoomen; Die Ränder verschwimmen, da sie beim Zoomen gestreckt werden.

Der Weg, um dies zu lösen, ist die Verwendung der Ordner mdpi, hdpi und so weiter. Du gibst Android ein Bild, das bereits skaliert wurde, damit es es nicht selbst tun muss. Wenn Sie das Bild in Photoshop einfach selbst strecken, wird es nicht besser aussehen. Aber normalerweise verkleinert man sehr große Bilder, um sie an den mobilen Bildschirm anzupassen. In diesem Fall ändern Sie die Größe einfach dreimal, jeweils in einer anderen Auflösung.

So endlich Ihre spezifische Frage zu beantworten: Wenn Sie ein Bild in Ihrem Ordner mdpi platziert haben, wird es unabhängig von der Bildschirmauflösung genau die gleiche Größe sein, solange sie alle die gleiche Dichte sind. Was sich ändern wird, ist wie viel Raum um sie herum, z.B. Ein 320x320px breites Bild würde den größten Teil eines 320x480-Bildschirms füllen, aber nur etwa ein Drittel eines 480x800-Bildschirms. Wie oben erwähnt, haben die Telefone mit höherer Auflösung jedoch im Allgemeinen auch einen dichteren Bildschirm. In diesem Fall sucht Android nicht in Ihrem mdpi-Ordner nach dem Bild - es wird in den hdpi-Ordner verschoben, und wenn es dort nicht gefunden werden kann, wird es den standardmäßigen "drawbaren" Ordner nehmen. Dann, wenn Sie DP verwendet haben, wird es automatisch skalieren, oder wenn Sie PX verwendet haben, wird es so belassen, wie es ist, und es wird nur kleiner aussehen.

Dort! Eine sehr lange Antwort für dich. Ich hoffe es macht Sinn.

+0

Wie unterscheidet man die Bildschirme 480X800 und 480X854? Wir haben eine Option, um das eine Bild in den Ordner hdpi zu legen. In meinem Fall 480X800 Bild wird nicht unterstützt für die 480x854 Bild.Any Idee? – Praveen

+2

@Praveen Chandrasekaran: Soweit ich weiß, kann man nicht zwischen den beiden unterscheiden auf dem hdpi Ordner angewiesen, aber das ist normal. Beide Bildschirme haben wahrscheinlich die gleiche Dichte. Sie können die Bildschirmgröße jedoch programmgesteuert abrufen. Siehe die Anzeige Metrics Klasse (http://developer.android.com/reference/android/util/DisplayMetrics.html) Dies ist eine sehr viel zuverlässige Art und Weise, es zu tun - ein Bildschirm Dichte von seiner Anzahl von Pixeln unabhängig ist. Zum Beispiel gibt es keinen absoluten Grund, warum ein Bildschirm keine hohe Dichte haben und nur 480x320 Pixel haben könnte. –

+0

„Ein Bild 300 Pixel breit 1,875 Zoll über sein werden. Dies wird durch die Pixelgröße berechnet wird (300)/Dichte (240)“ die 240 160 gemäß dem Satz vor –

4

Also, wenn ich ein Bild, das ist 300px breit im MDPI Ordner haben, wie kommt es zu gehen sehen die gleiche Größe auf allen 3 verschiedenen Bildschirmgrößen (hauptsächlich 320x480 vs die andere 2)?

Wie das Bild aussieht, wird physikalisch durch die Bildschirmdichte und nicht durch die Bildschirmgröße bestimmt. Ihr Ordner -mdpi ist nicht an die Bildschirmgröße gebunden - er ist an die Bildschirmdichte gebunden.

2

Können Sie bitte die Formel zur Berechnung der Bildschirmdichte bestätigen?

Wie ich gelesen haben, ist das folgende die Formel:

Dichte = SQRT (wp^2 + HP^2)/Siebgröße

wp -> Breite des Bildschirms (in Pixel) HP -> Höhe des Bildschirms (in Pixel) Siebgröße -> Physikalische Siebgröße (diagonaler Zoll)

Siebgröße (320x480) = SQRT (102400 + 230400)/160 = 3,6 Zoll

Siebgröße (480x800) = SQRT (640000 + 230400)/160 = 5,8 inches

Siebgröße (480x854) = SQRT (729316 + 230400)/160 = 6,12 inches

die Layouts (UI-Bildschirm), so werden durch Bildschirmgrößen angetrieben (small: < 3" , normal < 4 ", große> 5") und zeichnerische Ressourcen (Bilder) werden von Bildschirmdichten angetrieben. Die Größe des Bildes (in Pixeln) ändert sich nicht, wenn die Dichte der Bildschirme (320x480, 480x800 oder 480x854) gleich ist.

Könnten Sie bitte bestätigen?

Danke, Ram

8

Zur Vollständigkeit prüfen auch diese Option zur Steuerung Layout:

Verzeichnis-Qualifikation:

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

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 

Beschränken Sie Ihre App auf bestimmte Bildschirmgrößen (über die 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>

Und für die Code-Ebene tweeking:

 
float scale = getContext().getResources().getDisplayMetrics().density; 
Und nicht vergessen:

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

Es ist alles in diesem doc: developer.android.com:Supporting Multiple Screens

0

die folgenden Eigentlich ist der Code auf physische Bildschirmgröße für Geräte zu berechnen :

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); 
Verwandte Themen