German ungewöhnliche Screen-Auflösung, wie lösen ?

Paulsche

Well-Known Member
Licensed User
Longtime User
Hallo,

mein Programm läuft auf dem Samsung S2 (480x800) perfekt,
nun hat ein User ein HTC-Sensation (540x960), da ist dann das Programm
nicht Bildschirmfüllend (Siehe Screenshot der Startseite)

Im Anhang auch die Einstellung der Startseite im Designer.

Im Programm:
B4X:
   pnl00Startseite.Initialize("pnl00Startseite")
   activity.AddView(pnl00Startseite,0dip,0dip,320dip,480dip)
   pnl00Startseite.LoadLayout("00startseite")

Was muss ich tun damit die Auflösung korrekt auf dem HTC dargestellt wird ?

Wenn ich die Addview Zeile durch folgende ersetze:
B4X:
activity.AddView(pnl00Startseite,0dip,0dip,activity.width,activity.height)
, dann geht der Hindergrund zwar Bildschirmfüllend, aber die Views-Positionen sind unverändert. Muss ich hier dann meine Views in relation zu
der Activitygröße positionieren oder ist das eh der falsche Weg ?
Mit HTC-Auflösung im Designer zufügen hatte keine Auswirkung.
 

Attachments

  • 540-960.jpg
    540-960.jpg
    11.4 KB · Views: 299
  • startseite.jpg
    startseite.jpg
    17.1 KB · Views: 304
D

Deleted member 103

Guest
Hallo Paulsche,

die Zeile:
activity.AddView(pnl00Startseite,0dip,0dip,activity.width,activity.height)
würde ich so ändern
activity.AddView(pnl00Startseite,0dip,0dip,100%x,100%y)
was eigendlich das gleiche ist.

Muss ich hier dann meine Views in relation zu
der Activitygröße positionieren oder ist das eh der falsche Weg ?
Das ist leider richtig!

Ich mache es zur Zeit so:
B4X:
Sub Process_Globals
   Dim scale As Double
End Sub
Sub Activity_Create(FirstTime As Boolean)
   scale=1
   If Activity.Width > 480 Then
      scale=Activity.Width / 480 'Breite vom HTC-Desire
   End If

   btn1.Width=100dip * scale
   btn2.Width=100dip * scale
   ...
End Sub

Ciao,
Filippo
 

Paulsche

Well-Known Member
Licensed User
Longtime User
Hi,

ja, so wie Filippo beschrieben hat, so habe ic hes in meinem ganzen Programm gemacht und es hat bestens funktioniert.
Jede Position mit Scalefaktor angegeben.
 

mcmanu

Active Member
Licensed User
Longtime User
Hi

Habe das selbe Problem will jetzt die Variante testen :)
Hab nur ne kleine frage dazu :)
wenn ich jetzt hab
Activity.AddView(standartbtn,80dip,350dip,150dip,60dip)

Und ich benutze jetzt das
Sub Activity_Create(FirstTime As Boolean)

scale=1
If Activity.Width > 480 Then
scale=Activity.Width / 480 'Breite vom HTC-Desire
End If

muss ich dann schreiben standartbtn.left=80dip * scale
standartbtn.right=350dip *scale
standartbtn.witdh=150dip *scale
standartbtn.height=60dip*scale
??? aber wie mache ich das dann mit activity.addview?
Oder wie Funktioniert das?
Wie funktioniert es mit geräten die kleinere screens haben also weniger als 480?

Hoffe jemand kann mir da weiterhelfen :)
Erstmal aber danke die variante scheint viel viel leichter zu sein als alle views zu positionieren xD
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Das Problem mit den verschiedenen Bildschirmgrössen und verschiedenen Auflösungen ist leider ein grosses Dilemma.
Es gibt keine einzige Grundregel um das zu lösen.

1) Die erste Frage die man sich stellen muss ist:
Auf welchen Gerätetypen soll mein Programm laufen?
Beispiel:
3 Bildschirmgrössen:
- 3.5 '' Smartphone
- 7'' Tablett
- 10'' Tablett

Das 7'' Tablett hat eine 4 fach grössere Bildschirmfläche als das Smartphone.
Das 10'' Tablett hat eine doppelte Bildschirmfläche gegenüber dem 7'' Tablett und eine 8 fach grössere gegenüber dem Smartphone.

a) Soll auf allen Geräten das Layout gleich sein? Das heisst dass auf dem 10'' Tablett alle Views, flächenmässig, 8 mal grösser sind als auf einem Smartphone. In diesem Fall ist die Lösung mit der Scale Variable ein Teil der Lösung, es stellt sich dann immer noch die Frage der verschiedenen Höhe/Breite Verhältnisse die man im Code auch anpassen sollte. Eine andere Lösung wäre mit %x und %y Massen zu arbeiten. Man muss hier aber auch noch die Schriftgrössen anpassen.

b) Oder will Ich auf den Tabletts mehr Views gleichzeitig anzeigen als auf einem Smartphone. In diesem Fall sind Layoutvarianten die Lösung. Aber auch hier müssten die Varianten an die verschiedenen Höhe/Breite Verhältnisse im Code angepasst werden.

2) Die zweite Frage ist : Will Ich in beiden Bildschirmorientierungen arbeiten?
Wenn ja, zwei Layoutvarianten eine für jede Orientierung.

Als Zusammenfassung würde Ich generell vorschlagen :
6 Layoutvarianten für 3 Bildschirmgrössen (Smartphone, 7'' und 10'' Tabletts) und 2 Orientierungen.
Und im Code an die verschiedenen Höhe/Breite Verhältnisse und eventuelle spezielle Bildschirme anpassen.

Die Anzahl der Layoutvarianten kann vermindert werden wenn man die Anzahl der verschiedenen Zielgeräte verringert oder die Orientierung begrenzt.

Zu Deinen spezifischen Fragen:
??? aber wie mache ich das dann mit activity.addview?
Oder wie Funktioniert das?
Wie funktioniert es mit geräten die kleinere screens haben also weniger als 480?
schlage Ich Dir folgenen Code vor:
B4X:
scale = Activity.Width / 480
Activity.AddView(standartbtn, 80 * scale, 350 * scale, 150 * scale, 60 * scale)
Ohne dip.
Das gilt aber nur für die portrait Orientierung.

Beste Grüsse.
 
Last edited:

mcmanu

Active Member
Licensed User
Longtime User
Danke Klaus

Ja ich möchte es für das Galaxy S2 und z.b Galaxy note zum laufen bringen

Problem ist das ich meine views nicht im designer erstellt habe und somit keine layout varianten verwenden kann.

Ich werds heute mal Probieren mit dem code den du mir gegeben hast :) ich verwende zum Glück nur die Portrait Variante :)


Hoffe ich bekomm das Irgentwie hin wenn nicht muss ich wohl ein testprogramm schreiben und jede view einzeln im designer erstellen und testen wie es auf anderen screens aussieht (ufffff arbeit sag ich nur bei mehr als 100 views xD)

Danke dir :) mal schauen was ich heute für ein ergebniss bekomme :)
 

Paulsche

Well-Known Member
Licensed User
Longtime User
Ich mach das momentan mit folgendem Code (für Galaxy S2)
und Teste dann im Emulator noch mit HVGA, QVGA, da hab ich dann glaub
die wichtigsten Auflösungen unterstützt.

B4X:
   SCX = 1                                          'Scalefaktor X vorbelegen
   SCY = 1                                          'Scalefaktor Y vorbelegen
   If Activity.Width > 480 Then SCX = Activity.Width / 480      'Skalierung bei groesserer Breite
   If Activity.Height > 800 Then SCY = Activity.Height / 724   'Skalierung bei groesserer Hoehe

   Screenhoehe = Activity.Height

   ypos    = Round(Screenhoehe / 11)
   abstand   = Round(Screenhoehe / 19)                     'Abstand der Labels im Verhaeltnis zur Screenhoehe
   xpos   = 20dip*SCX

   LBL02Titel.setlayout(0,2dip*SCY,100%x,40dip)
   ypos = ypos + abstand
   LBL02Bezeichnung.setlayout(xpos,ypos,140dip,26dip)
 

mcmanu

Active Member
Licensed User
Longtime User
Danke

Danke dir, ich werd das mal ausprobieren :) sieht aber Vielversprechend aus :)
Warum benutzt du eigentlich 724 anstatt 800 bei If Activity.Height > 800 Then SCY = Activity.Height / 724?
Danke
 
Last edited:

mcmanu

Active Member
Licensed User
Longtime User
Funktioniert leider nicht

Schade, man ich bin echt am verzweifeln -.-

Naja bin gerade dabei für 800x1280 alle views richtig anzuordnen xD
wenn mir jemand noch sagen kann wie man im designer views ausblenden kann wär ich sehr sehr sehr dankbar xD
 
Last edited:

Paulsche

Well-Known Member
Licensed User
Longtime User
Neue Methode

Hallo, nach dem ich von einem User ein Screenshot (Galaxy Tab 10.1) der Startseite meiner APP "HB-Verbrauchszähler" bekommen habe,
habe ich dies jetzt folgender Maßen gelöst:

Ich arbeite nicht mehr mit erechnetem Scalefaktor wie z.B.
"SCX = Activity.Width / 480" , sondern so:

B4X:
Dim btn_breite,btn_hoehe,xpos,ypos,abstand,fsize As Int
   abstand      = 12.0165%y
   btn_breite   = 65.6%x
   btn_hoehe   = 11%y
   fsize      = 2.486%y
   xpos      = (100%x / 2) - (btn_breite /2)                              'X-Position auf Mitte
   ypos      = 10dip
   btn00Startseite_Strom.setlayout(xpos,ypos,btn_breite,btn_hoehe)
   btn00Startseite_Strom.TextSize = fsize
   ypos      = ypos + abstand
   btn00Startseite_Gas.setlayout(xpos,ypos,btn_breite,btn_hoehe)
   btn00Startseite_Gas.TextSize = fsize
   ypos      = ypos + abstand
   btn00Startseite_Wasser.setlayout(xpos,ypos,btn_breite,btn_hoehe)
   btn00Startseite_Wasser.TextSize = fsize
   ypos      = ypos + abstand
   BTN00Startseite_Sonstige.setlayout(xpos,ypos,btn_breite,btn_hoehe)
   BTN00Startseite_Sonstige.TextSize = fsize
   ypos      = ypos + abstand + 10dip
   BTN00Startseite_Zaehlerverwaltung.setlayout(xpos+2dip,ypos,btn_breite-4dip,btn_hoehe-6dip)
   BTN00Startseite_Zaehlerverwaltung.TextSize = fsize
   ypos      = ypos + abstand -3dip
   BTN00Startseite_Objektverwaltung.setlayout(xpos+2dip,ypos,btn_breite-4dip,btn_hoehe-6dip)
   BTN00Startseite_Objektverwaltung.TextSize = fsize
   ypos      = ypos + abstand -3dip
   SPN00Startseite_Objektfilter.setlayout(xpos-2dip,ypos,btn_breite+4dip,btn_hoehe+5dip)
   SPN00Startseite_Objektfilter.TextSize = fsize

   BTN00Startseite_beenden.setlayout((100%x / 2) - 20.31%x,100%y-(btn_hoehe+5dip),40.62%x,btn_hoehe)
   BTN00Startseite_beenden.TextSize = fsize

die %Werte ermittle ich nach folgender Formel wenn z.B. Buttonbreite 200 sein soll: 100*200/480 = 41,666%x


Wie in den Screenshots zu sehen haut das ziemlich hin.
Hab dies bis jetzt nur mal für die Startseite so geändert,
werde dies aber wohl durch das ganze Programm durchziehen,
da die Tablets wohl immer beliebter werden.
 

Attachments

  • Verbrauch_S2.jpg
    Verbrauch_S2.jpg
    39.9 KB · Views: 273
  • verbrauch_tablet_vorher.jpg
    verbrauch_tablet_vorher.jpg
    27.6 KB · Views: 293
  • verbrauch_tablet_nachher.jpg
    verbrauch_tablet_nachher.jpg
    35.6 KB · Views: 266

Android1848

New Member
Guten Tag liebe Experten.

Ich bin sehr neu auf dem Gebiet, bzw ich habe keine Ahnung :eek:

Ich habe es zumindest geschafft mir etwas für mein Galaxy S3 zu basteln, was es mir erlaubt per Klick direkt auf meine Favoriten zuzugreifen. Mehr brauch es auch nicht können.

Das Ganze sieht so aus
attachment.php


Nun habe ich leider das Problem, dass es auf kleineren Geräten nicht skaliert. Was hier alles geschrieben wurde, verstehe ich wenig bis garnicht.

Ich möchte, dass es auf anderen Smartphones und beim wechseln auf Querformat automatisch skaliert. Ich würde mich deshalb über detaillierte Hilfe freuen.

MFG
Android1848
 

Attachments

  • Screenshot_2012-08-05-15-25-03.png
    Screenshot_2012-08-05-15-25-03.png
    65.7 KB · Views: 431

cmweb

Active Member
Licensed User
Longtime User
Hi Android 1848,

Dann positionierst jede View in Relation zu Breite (x) und Höhe (y) des Gerätes.

Beispiel:

B4X:
Activity.AddView(imv,10%x,10%y,80%x,10%y)

Oder, wenn die View schon im Designer definiert wurde:

B4X:
imv.setlayout(10%x,10%y,80%x,10%y)

Herzliche Grüße

Carsten
 
Last edited:

Android1848

New Member
Hallo Carsten,
erstmal danke für die schnelle Antwort. Wo muss das genau rein? Entschuldige bitte, aber ich brauche leider detaillierte Hilfe. Hilft es wenn ich dir einen Teil zeige? Oder den ganzen per PM? Entschuldige bitte meine Unwissenheit :eek:

B4X:
Sub Globals
Dim TheLink As String
Dim TheLink2 As String
Dim TheLink3 As String
Dim TheLink4 As String
Dim TheLink5 As String
Dim TheLink6 As String
Dim TheLink7 As String
 
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.

   Dim imghomepage As ImageView
   Dim imgreviersport As ImageView
   Dim imgruhr As ImageView
   Dim imgwaz As ImageView
   Dim imgtransfermarkt As ImageView
   Dim imgvfl4u As ImageView
   Dim imgwaztext As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("vflbochum")
TheLink = "http://www.vflbochum.de"
TheLink2 = "http://www.derwesten.de/sport/fussball/vfl/"
TheLink3 = "http://www.reviersport.de/vereine/23-vfl-bochum-1848.html"
TheLink4 = "http://www.ruhrnachrichten.de/sport/vflbochum/"
TheLink5 = "http://vfl4u.instinske.de/wbb2/index.php"
TheLink6 = "http://www.transfermarkt.de/de/vfl-bochum/forum/ansicht_18.html"
TheLink7 = "http://www.derwesten.de/sport/fussball/vfl/"

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
Sub imghomepage_Click
Dim i As Intent


     i.Initialize(i.ACTION_VIEW, TheLink)

    StartActivity(i)
      Activity.AddView(imghomepage,10%x,10%y,80%x,10%y)
End Sub

Sub imgwaz_Click
Activity.AddView(imgwaz,10%x,10%y,80%x,10%y)
Dim i As Intent

     i.Initialize(i.ACTION_VIEW, TheLink2)

    StartActivity(i)
   
End Sub

Grüße
Andreas
 

cmweb

Active Member
Licensed User
Longtime User
Hi Andreas,

Activity.AddView(imghomepage,10%x,10%y,80%x,10%y)

Activity.AddView(imgwaz,10%x,10%y,80%x,10%y)
So würden beide Views übereinander liegen. Du musst die Werte für left und top natürlich bei jeder View anders definieren. Deine Screenshots zu urteilen, bleibt left immer gleich, also top anpassen.

Das kannst Du alles in der Sub Activity_Create machen.

Herzliche Grüße

Carsten
 
Top