Spanish [SOLUCIONADO] Tamaño de la fuente en un botón.

BlackBit

Member
Licensed User
Longtime User
Buenas a tod@s,

Llevo leídos unos cuantos hilos y cada vez entiendo menos.

El tema, es que cuando soportas mas de un idioma la longitud de las palabras puede variar mucho de uno a otro.
A la hora de crear los botones, imagenes, etc. y posicionarlos no hay problema. La resolución del dispositivo la controlo. Pero cuando paso al tamaño de la fuente, ésta me parte los esquemas.

Por lo que he leido, MeasureString solo funciona en canvas.

La pregunta es, hay alguna forma de controlar si cabe, o que alto y ancho ocupa...?

Gracias de antemano.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

La solución aunque algo trabajosa es coger la palabra mas larga y hacerla que entre con el tamaño adecuado, el problema de esto es que si hay algunas mas cortas se veran pequeñas.

Puedes solucionarlo de varias formas, una de ellas seria mirar la longitud del texto que va en el boton y luego pones el tamaño que creas conveniente, incluso podrias crear una funcion que te lo haga:

B4X:
botonx.TextSize = ExtraeAltoLetra("Prueba")


Sub ExtraeAltoLetra (TextoIn As String) As Int

  Dim AltoOut, AltoIn As Int

  AltoIn = TextoIn.Length
  AltoOut = 22 ' o la que tengas por defecto

  If AltoIn < 10 Then AltoOut = 30
  If AltoIn > 10 AND AltoIn < 20 Then AltoOut = 18
  If AltoIn > 20 Then AltoOut = 12
  ' ...................... y todas las que se te ocurran
  
   Return AltoOut

End Sub

Por otro lado si quieres controlar el alto que te ocupa un texto puedes emplear StringUtils y MeasureMultilineTextHeight(TextView, Texto) , con esto puedes ajustar el alto una vez que has puesto el texto y el tamaño, MeasureMultilineTextHeight te devuelve la altura que ocuparia la etiqueta (por ejemplo) y luego la cambias.
Basandote en esto puedes crear una funcion que le pases el objeto ya con sus medidas que vas a poner, y te cambie el alto.

B4X:
Sub CambiarAltoLabel (Objeto As Label)
  Dim StrUtil As StringUtils
  Dim ht As Float
  Dim Texto As String
  Texto = Objeto.text
  ht = StrUtil.MeasureMultilineTextHeight(Objeto, Texto)
  Objeto.height = ht
End Sub


Saludos
 

BlackBit

Member
Licensed User
Longtime User
Muchas gracias a ambos.
bgsoft :: No he tenido tiempo de probarlo, pero en cuanto lo haga te comento.
cbc51 :: Donde me descargo la librería, si no es molestia.
 

quimacama

Member
Licensed User
Longtime User
Muchas gracias a ambos.
bgsoft :: No he tenido tiempo de probarlo, pero en cuanto lo haga te comento.
cbc51 :: Donde me descargo la librería, si no es molestia.
Hola, yo utilizo la librería StringUtils y la verdad es que funciona muy bien. Después de "traducir" el literal del label llamo al siguiente método:
B4X:
Sub SetLabelTextSize(lbl As Label, txt As String, MaxFontSize As Float, MinFontSize As Float)
Try
    Dim FontSize = MaxFontSize As Float
    Dim Height As Int
    Dim stu As StringUtils
   
    lbl.TextSize = FontSize
    Height = stu.MeasureMultilineTextHeight(lbl, txt)
    Do While Height > lbl.Height AND FontSize > MinFontSize
        FontSize = FontSize - 1
        lbl.TextSize = FontSize
        Height = stu.MeasureMultilineTextHeight( lbl, txt)
    Loop
Catch
    Log("SetLabelTextSize " & LastException.Message  )
End Try   
End Sub


Por ejemplo:
B4X:
lblMenu1.Text =GetString("Addition")
SetLabelTextSize(lblMenu1, lblMenu1.Text,35,20)

La única "pega" es que solo funciona con labels, pero siempre puedes crearte un control panel con una dentro para simular un botón. ;)
 
Top