Italian Inverso di MeasureMultilineTextHeight

AlpVir

Well-Known Member
Licensed User
Longtime User
Con la funzione MeasureMultilineTextHeight di StringUtils si può impostare l’altezza di una label in funzione del testo.

B4X:
Dim minHeight As Int
minHeight = su.MeasureMultilineTextHeight(lbl, Text)
lbl.Height = Max(50dip, minHeight)

Io viceversa vorrei l’opposto, ossia stabilire la lunghezza del testo da visualizzare in funzione di una altezsa e laghezza fisse di una label. Questo allo scopo di visualizzare un “(segue)” oppure una serie 3 puntini “...” alla fine di un testo. Ovviamente al testo che riempirebbe completamente la label (di dimensioni fisse) sottrarrei 7 od 8 caratteri ed aggiungerei appunto il “(segue)” o il “ ...” in basso a destra.
Come potrei risolvere il problema visto che un Left(Testo,Lunghezza) produce risultati diversi a seconda dei testo stesso ?
Qualcosa come
B4X:
Testo=TagliaInFunzioneDelleDimensioniDellaLabel(Testo,lbl.width,lbl.height)
Grazie per l’attenzione
P.S.: un ulteriore miglioramento sarebbe troncare il testo in corrispondenza di uno spazio o dopo un segno di interpunzione.
 
D

Deleted member 103

Guest
Ciao Alpvir,

prova questa funzione. Dovrei fare qualche modifica come invece del "ScrollView1" inserire il tuo "Label".
B4X:
Sub getMaxTextWidth(strText As String, intWidth As Int) As String
    Dim strExtra As String
    Dim str As String
    Dim w As Int
    strExtra=""
    str=strText
    Canvas1.Initialize(ScrollView1)
    w=Canvas1.MeasureStringWidth(str,Typeface.DEFAULT_BOLD, 18)
    Do Until w < intWidth
        str=str.SubString2(0,str.Length - 1)
        w=Canvas1.MeasureStringWidth(str,Typeface.DEFAULT_BOLD, 18)
        strExtra="..."
    Loop
  
    'Log("w=" & w & " ;" &strText & "=" & str)
    Return str & strExtra
End Sub
 

AlpVir

Well-Known Member
Licensed User
Longtime User
La funzione funziona (sic !) benissimo ma solo per una certa larghezza. Potrei probabilmente modificarla in modo che tenga conto anche dell'altezza della label in cui va a finire la scritta, ma essa (la funzione) è assai pesante dal punto di vista computazionale e rallenta troppo la popolazione delle label. Questo a causa dell'approccio grafico e soprattutto dall'esame, carattere per carattere, della stringa, fino a trovare quella la cui lunghezza è immediatamente inferiore alla larghezza.
Le label fanno difatti parte di un CustomListView con qualche centinaio di item ciascuno dei quali comprende 3 diverse label di cui solo la terza ha 3 righe.
Capirai quindi che il modo di lavorare di questa funzione, validissimo in altri ambiti, non è praticabile nel mio caso.
Grazie comunque.
Un'altra soluzione - poche elegante e non molto efficace visivamente - sarebbe quella di sovrapporre una piccolissima label nell'angolo in basso a destra, label avente la proprietà Text settata a "...". Potrebbe però capitare che qualche lettera venisse troncata a metà con un risultato estetico non soddisfacente.
Altre idee ?
 
D

Deleted member 103

Guest
Hai ragione, nel tuo caso la funzione non va bene.
Mi dispiace ma a questo punto non ho altre idee.
 
Top