German Gleich große views auf allen Geräten

Discussion in 'German Forum' started by Gunther, Jun 2, 2015.

  1. Gunther

    Gunther Member Licensed 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: Jun 2, 2015
  2. klaus

    klaus Expert Licensed User

    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.
    Code:
    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
     
  3. Gunther

    Gunther Member Licensed 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:

    Code:
    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, 10dip50%y100%x25%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%yColors.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: Jun 2, 2015
  4. klaus

    klaus Expert Licensed 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.
     
    KMatle likes this.
  5. Gunther

    Gunther Member Licensed User

    Ok, ist mal so!

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

    Code:
    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
     
  6. klaus

    klaus Expert Licensed User

    Manche Leute nennen so was Kompromiss :).
     
Loading...