German Schriftgröße berechnen

HarryPottier

Member
Licensed User
Folgendes Problem
Bei meinen app funktioniert in einem Label die Schriftgröße passend gut
Label1.TextSize = 11

Die beide Handys sind ein Samsung A70, und ein altes Samsung S5
GetDeviceLayoutValues am Samsung zeigt an:
1080 x 2198, scale = 2.6 (420 dpi)

Auf einen älteren Tablet ist die Schriftgröße (Label1.TextSize = 11) deutlich zu klein
GetDeviceLayoutValues am Tablet zeigt an:
800 x 1298, scale = 1.0 (160 dpi)

Das Tablet hätte eine annehmbar Schriftgröße bei (Label1.TextSize = 15)

Wie berechne ich die Schriftgröße damit diese eine annehmbar Größe auf andere Geräte haben ?
 

Alexander Stolte

Expert
Licensed User
Longtime User
Wie berechne ich die Schriftgröße damit diese eine annehmbar Größe auf andere Geräte haben ?
B4X:
Public Sub setText(value As Object)
    mlbl.Text = value
    Dim multipleLines As Boolean = mlbl.Text.Contains(CRLF)
    Dim size As Float
    For size = 2 To 200
        If CheckSize(size, multipleLines) Then Exit
    Next
    size = size - 0.5
    If CheckSize(size, multipleLines) Then size = size - 0.5
    Sleep(0)
    mlbl.TextSize = size
    'Log(size)
    'Log(mlbl.TextSize)
End Sub

'returns true if the size is too large
Private Sub CheckSize(size As Float, multipleLines As Boolean) As Boolean
    mlbl.TextSize = size
    If multipleLines Then
        #If B4A
        Dim su As StringUtils
        Return su.MeasureMultilineTextHeight(mlbl,mlbl.Text) > mlbl.Height
       
        #Else if B4I
        Dim tmplbl As Label = mlbl
        tmplbl.Multiline = True
        mlbl = tmplbl
        'Return MeasureTextHeight(mlbl.Text,mlbl.Font) > mlbl.Height
        Return getTextHeight(mlbl.Text,mlbl.Font,mlbl.Width) > mlbl.Height
        #Else B4J
       
        Return MeasureMultilineTextHeight(mlbl.Font,mlbl.Width,mlbl.Text)
       
        #End If
       
    Else
   
        #if b4A
        Dim stuti As StringUtils
        Return MeasureTextWidth(mlbl.Text,mlbl.Font) > mlbl.Width Or stuti.MeasureMultilineTextHeight(mlbl,mlbl.Text) > mlbl.Height
       
        #Else
       
        Return MeasureTextWidth(mlbl.Text,mlbl.Font) > mlbl.Width Or MeasureTextHeight(mlbl.Text,mlbl.Font) > mlbl.Height
           
        #End If
       
    End If
   
End Sub
Aus meiner
 

HarryPottier

Member
Licensed User
verstehe leider nicht was in dem „AutoTextSizeLabel.bas“ passiert

habe von den 4 CustomView (Label) 3 entfern.
An der entsprechenden stelle in der „AutoTextSizeLabel.bas“, wo die errechnete Schriftgröße ermittelt wird, eine globale Public Variable eingebaut die den Wert „Size“ abfängt.

Dieser Wert dient mir nun im gesamte Projekt als Orientierung, für Button, Label, ListView usw.

nicht gerade eine elegante Art, eine geeignete Schriftgröße zu ermitteln. 🤔

Irgendwie bin ich immer noch der Meinung, dass aus den Werte der GetDeviceLayoutValues, der scale Faktor oder die dpi ein Wert errechnet werde könnte.
 

Alexander Stolte

Expert
Licensed User
Longtime User
B4X:
Private Sub PerfectTextSize(text As String,yourlabel As B4XView) As Float
    Dim multipleLines As Boolean = text.Contains(CRLF)
    Dim size As Float
    For size = 2 To 200
        If CheckSize(multipleLines,text,yourlabel) Then Exit
    Next
    size = size - 0.5
    If CheckSize(multipleLines,text,yourlabel) Then size = size - 0.5
    Return size
End Sub

Private Sub CheckSize(multipleLines As Boolean,text As String,yourlabel As B4XView) As Boolean

    Dim su As StringUtils
    If multipleLines Then
      
        Return su.MeasureMultilineTextHeight(yourlabel,text) > yourlabel.Height
      
    Else

        Return MeasureTextWidth(text,yourlabel.Font) > yourlabel.Width Or su.MeasureMultilineTextHeight(yourlabel,text) > yourlabel.Height
      
    End If
  
End Sub

'https://www.b4x.com/android/forum/threads/b4x-xui-add-measuretextwidth-and-measuretextheight-to-b4xcanvas.91865/#content
Private Sub MeasureTextWidth(Text As String, Font1 As B4XFont) As Int
#If B4A
    Private bmp As Bitmap
    bmp.InitializeMutable(1, 1)'ignore
    Private cvs As Canvas
    cvs.Initialize2(bmp)
    Return cvs.MeasureStringWidth(Text, Font1.ToNativeFont, Font1.Size)
#Else If B4i
    Return Text.MeasureWidth(Font1.ToNativeFont)
#Else If B4J
    Dim jo As JavaObject
    jo.InitializeNewInstance("javafx.scene.text.Text", Array(Text))
    jo.RunMethod("setFont",Array(Font1.ToNativeFont))
    jo.RunMethod("setLineSpacing",Array(0.0))
    jo.RunMethod("setWrappingWidth",Array(0.0))
    Dim Bounds As JavaObject = jo.RunMethod("getLayoutBounds",Null)
    Return Bounds.RunMethod("getWidth",Null)
#End If
End Sub
 

pucki

Active Member
Licensed User
mach es einfach SO.


Dann hast du keine Probleme. ;) Egal welche Auflösung dein Handy hat.

Gruß

Pucki
 

HarryPottier

Member
Licensed User
Danke Pucki
Habe verschiedene versuche gemacht
Bei mir kommt der Wert 22 als Resultat

Log ((GetDeviceLayoutValues.Height - 100%y) / 3) ‘ = 22

Ich finde dort jedoch keinen Zusammenhang auf eine mögliche Schriftgröße
 
Last edited:

pucki

Active Member
Licensed User
B4X:
sub prg_ini

If prg_status = "am laden" Then
        Return
    End If

    faktor_x =   ((GetDeviceLayoutValues.Width) / GetDeviceLayoutValues.Scale  / 350 ) ' 350 = grösse des Layouts im Designer
    faktor_y = ((GetDeviceLayoutValues.Height ) / GetDeviceLayoutValues.Scale / 640) '640 = grösse des Layouts im Designer

    For Each v As View In Activity.GetAllViewsRecursive
        v.Top = v.Top * faktor_y
        v.left  = v.Left * faktor_x
        v.Width = v.Width * faktor_x
        v.Height = v.Height * faktor_y
    Next
'   
    my_panel_1.Visible = True
    For Each v As View In my_panel_1.GetAllViewsRecursive

        v.Top = v.Top * faktor_y
        v.left  = v.Left * faktor_x
        v.Width = v.Width * faktor_x
        v.Height = v.Height * faktor_y
        v.BringToFront
    Next
    
    end sub


Diese Sub setzt alle Größen bei mir richtig. Bedingung ist das ich das Design im Designer mit 640 * 350 gesetzt habe und die Objekte im Designer erstellt habe. Eigentlich ist das die Design-Größe egal das Prg. muss sie nur wissen. Die Schriftgröße passt sich dann bei fast alles Objekten die im Designer erstellt werden automatisch an.

Bei Objekten wie das Grid zb. setzte ich die Font-größe dann vom Prg. nach der Neuberechnung.

Dazu ist es erforderlich das ich den größten Faktor errechne und die Font neu setzte mit Int . z.b.

grid.RowTextSize = int(18 * faktor_max)





Gruß

Pucki
 
Top