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