German Ein altes Thema: Texthöhe in Labels/Buttons

Gumnam

Member
Licensed User
Longtime User
Hallo Gemeinde,

wahrscheinlich gehe ich Euch auf den Keks, aber ich komme einfach nicht weiter....
Ich möchte gerne die Textgröße (Size) an die Label bzw. Buttonhöhe bestmöglich anpassen.

Dazu habe ich 2 Routinen geschrieben:

B4X:
Sub SetBestTextSizeL(lbl As Label)
  Dim Size As Float
  Dim SU As StringUtils
    Size=1: lbl.TextSize=Size
    Do While SU.MeasureMultilineTextHeight(lbl,lbl.Text)<lbl.Height
      Size=Size+1:lbl.TextSize=Size
    Loop
End Sub

Sub SetBestTextSizeB(btn As Button)
  Dim Size As Float
  Dim SU As StringUtils
  Dim refl As Reflector
  Dim H As Float
    refl.Target=btn
    H=btn.Height-refl.RunMethod("getPaddingTop")-refl.RunMethod("getPaddingBottom")
    Size=1: btn.TextSize=Size
    Do While SU.MeasureMultilineTextHeight(btn,btn.Text)<H
      Size=Size+1:btn.TextSize=Size
  Loop
End Sub

Aber irgendwie scheinen beide Rroutinen nicht bei Multiline-Text zu funktionieren

Irgend eine Idee ?
 

Attachments

  • FC.zip
    405.7 KB · Views: 218

Gumnam

Member
Licensed User
Longtime User
Hallo Klaus,

Vielen Dank!
Den Wald mal wieder vor lauter Bäumen übersehen...

Hier noch mal die korrigierte Version:
B4X:
Sub SetBestTextSizeL(lbl As Label)
  Dim Size As Float
  Dim SU As StringUtils
    Size=1: lbl.TextSize=Size
    Do While SU.MeasureMultilineTextHeight(lbl,lbl.Text)<lbl.Height
      Size=Size+1:lbl.TextSize=Size
    Loop
    lbl.TextSize=Size-1
End Sub

Sub SetBestTextSizeB(btn As Button)
  Dim Size As Float
  Dim SU As StringUtils
  Dim refl As Reflector
  Dim H As Float
    refl.Target=btn
    H=btn.Height-refl.RunMethod("getPaddingTop")-refl.RunMethod("getPaddingBottom")
    Size=1: btn.TextSize=Size
    Do While SU.MeasureMultilineTextHeight(btn,btn.Text)<H
      Size=Size+1:btn.TextSize=Size
    Loop
    btn.TextSize=Size-1
End Sub
(Anmerkung: Multiline wird's mit diesem Code nie! Ist ja klar, weil die Textgröße durch die fixierte Höhe der Views begrenzt wird. Sobald der Text mehrzeilig werden würde, passt er ja nicht mehr in die vorgegebene Höhe!)

Eigentlich wollte ich die Schleifen wie in VB ansetzten:
B4X:
Do
  :
Loop Until ....
geht ja nicht - Welche Schleifenkonstruktion hättest Du gewählt?

(Ich würde Dich gerne "liken" -bin aber strikter socialnetwork-Gegner...)
 

klaus

Expert
Licensed User
Longtime User
Ich hätte es anders rum gemacht, mit einer grossen Schriftgrösse anfangen und den Wert vermindern bis die Höhe kleiner ist.
Was ist der Grund dass Du die Schriftgrösse an die Buttonhöhe anpassen willst.

(Ich würde Dich gerne "liken" -bin aber strikter socialnetwork-Gegner...) Ist mir Wurst :).
 

Gumnam

Member
Licensed User
Longtime User
Das mit dem "liken" habe ich falsch verstanden: Ich dachte, dass man über Facebook liken muss - is' aber nicht...
So habe ich Deine Antwort nun honoriert!
(Ehre, wem Ehre gebührt)

Ich finde eine Höhe von 60dip ist für "Otto-Normal-Finger" ausreichend - deshalb sollten Buttons (aus meiner Sicht) diese (+/- 10dip) fixe Größe haben.
Außerdem möchte ich bei großen Displays (3,5'' vs. 5'') nicht "klobig" wirken...

Ich weiß - da gehen die Meinungen auseinander - aber jeder Coder hat so seinen Stil...

LG und nochmal: Vielen Dank! Ich werde das mit dem umgekehrten "heran tasten" an die Textgröße wohl übernehme - geht halt schneller.
Womit soll ich anfangen - mit Size=height ?
 

klaus

Expert
Licensed User
Longtime User
Versuche mal eine Grösse zu rechnen.
Es muss ein Verhältniss zwischen View.Höhe (in 'normalisierten' Pixels) geben.
Ich hab ein bisschen 'rumgefummelt'.
Die Schriftgrösse ist in Punkten ausgedrückt.
Versuche mal mit diesem Wert anzufangen size = H / LayoutValues.Scale / 1.3
Oder versuche direkt den size Wert mit size = H / LayoutValues.Scale / 1.35 zu rechnen.
 
Top