German Gleich große views auf allen Geräten

Gunther

Active Member
Licensed User
Longtime User
Moin Klaus,
Du als Scaleing Papst hast bestimmt eine einfache Lösung für das Nicht-skalieren von Views.
Letzt endlich will ich, das die Views auf allen Geräten immer gleich groß sind. D. h. z. B. 3x2 cm, egal, ob auf einem Tablett oder einem 2.8" Phone. Also nicht das gleiche Erscheinungsbild haben!

Oder noch besser, tatsächlich die Größe in cm festlegen?

Gruß Gunther
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Letzt endlich will ich, das die Views auf allen Geräten immer gleich groß sind. D. h. z. B. 3x2 cm,...
Mit welcher Genauigkeit willst Du die 3x2 cm.
Wenn Du keine grosse Genauigkeit brauchst setze die Breite und Höhe mit dip (density independant pixels) Werten.
Mit diesen Werten sind die Masse ungefähr gleich auf allen Geräten und Auflösungen.
Die 'standard' Abdroid Bildschirmauflösung ist 160 dpi (dots per inch) also 160 Pixel pro Zoll.
Die dip Werte entsprechen dieser 'standard' Auflösung.
Zum Beispiel 100dip entprechen.
100 Pixel Density 1
150 Pixel Density 1.5
200 Pixel Density 2
usw.
Die wirkliche dpi (dots per inch) Auflösung ist aber je nach Gerät ein bisschen anders.
Ein Gerät mit einer 'standard' Auflösung von 160 dpi kann eine wirkliche Auflösung zwischen ungefähr 140 bis 180 haben je nach Bildschirmgrüsse.

Falls Du es aber genau brauchst kannst Du die wirklichen dpi Werte des Gerätes mit diesem Code mit der Reflection Library bekommen und dann die cm nach Zoll und Pixels umwandeln.
B4X:
Sub Activity_Create (FirstTime As Boolean)
   Dim r As Reflector
   r.Target = r.GetContext
   r.Target = r.RunMethod("getResources")
   r.Target = r.RunMethod("getDisplayMetrics")
   Log(r.GetField("xdpi"))
   Log(r.GetField("ydpi"))
End Sub
 

Gunther

Active Member
Licensed User
Longtime User
Danke für die Info!

Leider ist es mit den exakten Werten auch nicht möglich.

HTC One M8 -> 3 cm (passt!)
Galaxy Note -> 3,3 cm bzw. 3,2 cm

Hier ein kleines Beispiel für Linien bei 3 cm:

B4X:
Sub Activity_Create(FirstTime As Boolean)
    '
        Private r As Reflector
        Private xdpi, ydpi, gdpi As Double
        Private cmx, cmy As Double
        Private px, py As Int
    '
        lblWerte.Initialize("")
        Activity.AddView(lblWerte, 10dip, 50%y, 100%x, 25%y)
    ' dpi Werte des Gerätes
        r.Target = r.GetContext
        r.Target = r.RunMethod("getResources")
        r.Target = r.RunMethod("getDisplayMetrics")
    '
        xdpi = r.GetField("xdpi")
        ydpi = r.GetField("ydpi")
    ' durchschnittliche dpi
        gdpi = (xdpi + ydpi)/2
    ' 3 cm
        cmx = 3
        cmy = cmx
    ' Pixelanzahl in der Breite = Breite [cm] / 2,54 [cm/i] x Auflösung [dpi]
        px = Floor(cmx / 2.54 * xdpi)
        py = Floor(cmy / 2.54 * ydpi)
    ' Hintergrund weiß
        Activity.Color  = Colors.White
    ' Linie setzen
        Private cvsAct As Canvas
        cvsAct.Initialize(Activity)
    ' 3 cm vom linken Rand
        cvsAct.DrawLine(px, 0%y, px, 100%y, Colors.Red, 1dip)
    ' 3 cm von Oben
        cvsAct.DrawLine(0%x, py, 100%x, py, Colors.Red, 1dip)
    ' Anzeigen
        lblWerte.Text =  "xdpi: " & xdpi & CRLF & _
                     "ydpi: " & ydpi & CRLF & _
                     "gdpi: " & gdpi & CRLF & _
                     "px: "   &  px  & CRLF & _
                     "py: "   &  py     
              
End Sub

Grüße Gunther
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Leider geben nicht alle Hersteller die richtigen Angaben !
Ich habe ein Programm, mit deinem Code, erstellt und auf meinen Geräten getestet.
Auf meinem Sony xpria1 ist es OK.
Auf meinem Asus funktioniert es auch nicht.
Die geben für x = 225.777 und y = 240 an !?
Der y Wert ist falsch, das ist die 'normierte' Auflösung. Wunderte mich schon dass die rechteckige Pixel hätten.
Mit dem x Werte für beide Richtungen ist es OK.

Kenne leider keine Lösung dafür.
 

Gunther

Active Member
Licensed User
Longtime User
Ok, ist mal so!

Nun, ich habe eine kleine Näherung dann...

B4X:
pg = Min(px, py) * ( Min(px, py) / Max(px, py) )

pg dann für beide Richtungen.

Bei richtigen Angaben ist es nicht ganz so falsch und bei falschen wird es richtiger!

Grüße Gunther
 
Top