Einheit "dip" unterschiedlich groß

  • Antworten:17
Maximilian O
  • Forum-Beiträge: 990

05.10.2011, 16:34:42 via Website

Hey Leute,
ich habe ein mehr oder weniger großes Problem. In der offiziellen Android-Dokumentation steht folgendes:
160dp is always one inch regardless of the screen density
Auf gut deutsch, 160dip sind immer 2,54cm. Aber dem ist nicht so. Auf jedem Telefon sind 160dip unterschiedlich groß.
Habt ihr dafür irgendeinen Lösungsvorschlag oder Erfahrungen?
MfG Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Maximilian O
  • Forum-Beiträge: 990

05.10.2011, 18:31:05 via Website

Noch keiner dieses Problem bemerkt?
MfG

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

05.10.2011, 20:02:27 via Website

Hallo.

Was konkret meinst du mit "auf jedem Telefon"? Auf welchen Geräten und mit welcher Messmethode hast du das geprüft? Ich frage, weil ich bislang recht gute Erfahrungen mit dp gemacht habe.

Viele Grüße
Thomas

— geändert am 05.10.2011, 22:18:01

Antworten
Maximilian O
  • Forum-Beiträge: 990

05.10.2011, 20:19:10 via App

Naja, ich habe einen. 160dip großen streifen auf meinem Display. nun messe ich einfach mit dem lineal, ob es 2,54cm entspricht.
MfG

//ps: am schlimmsten ist es auf dem sensation

— geändert am 05.10.2011, 20:54:44

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Maximilian O
  • Forum-Beiträge: 990

05.10.2011, 21:23:23 via App

Danke Luhu, habe ich auch schon gesehen. Habt ihr so etwas beim testen auf dem Sensation auch schon mitbekommen?

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

05.10.2011, 21:44:42 via App

Hm, da ich nur ein Desire habe kann ich dazu leider nichts sagen.
Der einzige vom AndroidPit Team der ein Sensation hat ist meines Wissens der Steven Blum (von der englischen Seite)...

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

05.10.2011, 21:49:57 via Website

DIP ist doch einfach nur ein Verhältnis von absoluter Pixelzahl zu einer abstrakten dreistufigen Pixeldichte (ldpi/mdpi/hdpi).
Das ist weit weg von einem stufenlos übersetzbaren absoluten Längenmaß in metrischen Einheiten. Da verspricht die Doku vielleicht etwas viel.

Klar, dass Geräte mit unterschiedlich großen Displays, aber identischer Auflösung die gleiche Zahl von DIPs unteschiedlich groß rendern.

Wie groß ist denn der Unterschied in mm?

— geändert am 05.10.2011, 21:56:34

Antworten
Niels
  • Forum-Beiträge: 7

05.10.2011, 23:37:11 via Website

Hi zusammen!

Rafael K.
DIP ist doch einfach nur ein Verhältnis von absoluter Pixelzahl zu einer abstrakten dreistufigen Pixeldichte (ldpi/mdpi/hdpi).
Das ist weit weg von einem stufenlos übersetzbaren absoluten Längenmaß in metrischen Einheiten. Da verspricht die Doku vielleicht etwas viel.

Rafael, woher hast du diese Info? Die offizielle Doku auf developer.android.com, was normalerweise die erste Quelle für mich ist (und im Zweifel die einzige, der man vertraue sollte), sagt:
Density-independent pixel (dp)
A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application's UI, to ensure proper display of your UI on screens with different densities.
Zusammengefasst heißt das, dass 160dip auf jedem Telefon 1 Zoll sind. Auf dem Samsung Galaxy S funktioniert das auch super. Auf dem HTC Sensation ist es eine Katastrophe. Dort sind 160dip etwa 2.3 Zentimeter, was weit entfernt von einem Zoll ist.

Viele Grüße,
Niels

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

06.10.2011, 00:23:49 via Website

Hallo.

Lasst uns doch mal Nägel mit Köpfen machen...

Das folgende Quelltextfragment (am einfachsten in onCreate()) ...

1WindowManager wm = getWindowManager();
2DisplayMetrics outMetrics = new DisplayMetrics();
3wm.getDefaultDisplay().getMetrics(outMetrics);
4Log.d(TAG, "The logical density of the display: " + outMetrics.density);
5Log.d(TAG, "The screen density expressed as dots-per-inch: " + outMetrics.densityDpi);
6Log.d(TAG,
7 "The exact physical pixels per inch of the screen in the X dimension: "
8 + outMetrics.xdpi);
9Log.d(TAG,
10 "The exact physical pixels per inch of the screen in the Y dimension: "
11 + outMetrics.ydpi);

...liefert auf einem Nexus S:

110-06 00:15:40.644: DEBUG/TestprojektActivity(1928): The logical density of the display: 1.5
210-06 00:15:40.644: DEBUG/TestprojektActivity(1928): The screen density expressed as dots-per-inch: 240
310-06 00:15:47.308: DEBUG/TestprojektActivity(1928): The exact physical pixels per inch of the screen in the X dimension: 234.46153
410-06 00:15:47.312: DEBUG/TestprojektActivity(1928): The exact physical pixels per inch of the screen in the Y dimension: 236.27907

Welche Werte liefert denn ein Sensation?

Viele Grüße
Thomas

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

06.10.2011, 08:24:48 via Website

Niels
Hi zusammen!

Rafael K.
DIP ist doch einfach nur ein Verhältnis von absoluter Pixelzahl zu einer abstrakten dreistufigen Pixeldichte (ldpi/mdpi/hdpi).
Das ist weit weg von einem stufenlos übersetzbaren absoluten Längenmaß in metrischen Einheiten. Da verspricht die Doku vielleicht etwas viel.

Rafael, woher hast du diese Info?
Das ist für mich eine Konsequenz der Tatsache, dass es in Android 3 feste Klassen für die Pixeldichte von Displays gibt.
Auch in der von dir zitierten Doku wird explizit auf die "medium" density verwiesen.
DIP sind imho besonders dafür gedacht zwischen diesen 3 Stufen zu skalieren und Anwendungen bildschirmfüllend, bzw. mit exakt dem gleichen Layout auf lpdi + mdpi + hdpi zu erreichen.

Zumindest deckt es sich mit meinen Erfahrungen bei der Programmierung, aber ich lerne auch gerne dazu, wenn ich mich irre :)
Für absolute Größenangaben sind ja speziell mm als Einheit vorgesehen, die dann logischerweise die ECHTE dpiDensity des im konkreten Modell verwendeten Displays zu Grunde legen müssen.

EDIT:
Würde sich ja auch mit dem Bsp von Thomas decken.
Es gibt eine "logische" density und eine "physikalische", die auch unterschiedlich sein können und die physikalische wird auf die naheliegendste Stufe der 3 logischen densities gerundet.

— geändert am 06.10.2011, 08:31:00

Antworten
Niels
  • Forum-Beiträge: 7

06.10.2011, 10:16:02 via Website

Hi zusammen.

Rafael K.
Für absolute Größenangaben sind ja speziell mm als Einheit vorgesehen, die dann logischerweise die ECHTE dpiDensity des im konkreten Modell verwendeten Displays zu Grunde legen müssen.

Das ist leider nicht der Fall. 25,4mm = 1in = 160dip. Das weiß auch Android und rechnet korrekt um, d.h. ich kann diese Größen austauschen, ohne dass sich an der Anzeige etwas ändert. Leider ist 1mm nicht 1 Millimeter, sondern das, was der Hardwarehersteller daraus macht.

Thomas Künneth
Welche Werte liefert denn ein Sensation?

Das Sensation liefert wie erwartet irgendwelchen Quark:

10-06 10:15:01.488: DEBUG/DipTestActivity(6606): The logical density of the display: 1.5
10-06 10:15:01.488: DEBUG/DipTestActivity(6606): The screen density expressed as dots-per-inch: 240
10-06 10:15:01.488: DEBUG/DipTestActivity(6606): The exact physical pixels per inch of the screen in the X dimension: 159.48837
10-06 10:15:01.488: DEBUG/DipTestActivity(6606): The exact physical pixels per inch of the screen in the Y dimension: 160.42105

Viele Grüße,
Niels

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

06.10.2011, 10:47:29 via Website

Hallo.


OK das sieht definitiv nach einem Bug aus.

Vorsicht, man müsste die Werte erst nochmals gegenrechnen. Siehe Vorschlag weiter unten. Unabhängig von den Werten des Sensation müssen wir uns im konkreten Anwendungsfall vielleicht einfach von den dps verabschieden. Lest mal folgenden Text:

http://developer.android.com/reference/android/util/DisplayMetrics.html#density


The logical density of the display. This is a scaling factor for the Density Independent Pixel unit, where one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), providing the baseline of the system's display. Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc.
This value does not exactly follow the real screen size (as given by xdpi and ydpi, but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi. For example, a 240x320 screen will have a density of 1 even if its width is 1.8", 1.3", etc. However, if the screen resolution is increased to 320x480 but the screen size remained 1.5"x2" then the density would be increased (probably to 1.5).

Mein Vorschlag wäre, im konkreten Anwendungsfall die Größe im Programm zu setzen, und zwar als echte Pixel, wobei ich zur Berechnung mal die Daten aus meinem Beispielcode nehmen würde. Was dann auf der Anzeige erscheint, könnte man mal nachmessen. Irgendwie habe ich das Gefühl, dann würde es sogar passen.

Viele Grüße
Thomas

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

06.10.2011, 11:05:21 via Website

Hallo.

160 kann doch eigentlich nur ein Fehler in der Firmware sein.

Stimmt schon. :-)

Wüssten wir die Breite und Höhe des Panels, könnten wir mit dem guten alten Pythagoras die richtigen Werte berechnen.

Ich bin aber bei dir, die gelieferten ca. 160 sind zu wenig.

Gruß
Thomas

Antworten
Niels
  • Forum-Beiträge: 7

06.10.2011, 11:59:56 via Website

Da ich einen Anwendungsfall habe, wo es auf die genauen Maße ankommt, bleibt mir wohl nichts anderes übrig, als die Berechnung im Code durchzuführen. Das ist natürlich blöd, weil dann UI-Design und Code wieder gemixt wird, was mit den XML-Dokumenten eigentlich verhindert werden sollte...

Rafael K.
Laut Spezifikation hat das Sensation folgende Daten:

540 x 960 pixels, 4.3 inches (~256 ppi pixel density)

160 kann doch eigentlich nur ein Fehler in der Firmware sein.
Dann sollte man das wohl mal an HTC kommunizieren.

An google werde ich dann auch mal schreiben. Die Doku ist ja schließlich inkonsistent (an einer Stelle schreibt man, dass dip an der Pixeldichte des Geräts hängt, an einer anderen Stelle dann wieder, dass das nur so ungefähr ist).

Viele Grüße,
Niels

Antworten