2010-05-26 11 views
21

Sto cercando di calcolare come WIDE rendere il mio pulsante, in base al testo che conterrà, e quando provo a google per come calcolare qualcosa di semplicistico come la LARGHEZZA DI ALCUNI TESTO, vado a guardare con gli occhi spalancati cercando di guadare un voodoo esoterica apparentemente privo di senso apparentemente controintuitivo. Qualcuno può aiutarmi a semplificare per me come scrivere una funzione come questa:Calcolo della larghezza del testo in ActionScript e Flex

public function HowWideWouldThisTextBeIfItWereInThisButton(Text:String,Container:Button):int { 
... 
} 

Grazie in anticipo.

+0

Quando dici il testo nel pulsante ... intendi l'etichetta per il pulsante? o un campo di testo o una casella di testo? – phwd

risposta

21

Finché sei in un'UIComponent, è possibile utilizzare la funzione di measureText.

public function howWideWouldThisTextBeIfItWereInThisButton(text:String,container:Button):int { 
    var lineMetrics:TextLineMetrics = container.measureText(text); 
    return lineMetrics.width;  
} 

Detto questo, la componente della flessione del tasto dovrebbe dimensionare automaticamente alla larghezza del testo, se non si imposta una larghezza su di esso. In questo modo se hai bisogno della larghezza del testo, puoi semplicemente chiamare usa la proprietà textWidth.

+2

Probabilmente sto facendo qualcosa di sbagliato, ma ottengo: TypeError: Errore # 2007: il parametro antiAliasType deve essere non nullo. – Joshua

+0

Stai impostando antiAliasType? – quoo

+0

WHAT antiAliasType? Cos'è quello? Dove lo metto? Fa parte di lineMetrics? Il tasto?? Come lo trovo? – Joshua

-1

Suona come si potrebbe usare textWidth

+0

In che modo prende in considerazione il formato, il carattere, le dimensioni e altri attributi dell'etichetta del pulsante? – Joshua

0

Joshua, aiuta davvero a essere chiari. Stai parlando di TextField, MX Label, Spark Label, RichText, ecc.? Componenti di testo diversi utilizzano motori di testo diversi, come FTE e TLF e possono avere soluzioni diverse. Desidero certamente che Adobe abbia un buon set di utilità o codice di esempio che possa prevedere quale sarà la dimensione del font reso sui controlli, prima che tu lo faccia effettivamente. Ma la buona notizia è che in certi casi, come in un buon vecchio campo di testo, puoi prevederlo abbastanza bene. Basta creare un campo di testo, impostarlo come campo textFormat, metodo di ridimensionamento automatico e testo. Dovresti essere in grado di ottenere le sue dimensioni prima di aggiungerlo ovunque. Non ricordo quale fosse l'ordine, ma ricordo che l'ordine con cui hai impostato quelle proprietà è importante. Se non riesci a capire come farlo, posso fornire un esempio di codice. Ora, per i nuovi componenti "migliorati", come Spark Labels, sarò infastidito se riesco a trovare un modo maledetto ... ho trascorso un numero di ore su questo e non ho trovato un modo .. o qualcuno che conosce un modo: P.

2

Here's come lo fate in Spark:

Ho modificato - semplificato - il suo esempio un po 'qui:

var textMetrics:TextLineMetrics = label.measureText(label.text); 
var textWidth:int = textMetrics.width; 
9

Questo funziona in qualsiasi formato, dimensione, tipo di carattere. Non dimenticare le proprietà "autoSize" e "wordWrap"!

var tf:TextField = new TextField(); 
addChild(tf); 
tf.autoSize = TextFieldAutoSize.LEFT; 
tf.wordWrap = false; 
tf.text = "Whatever here"; 
tf.width = tf.textWidth + 4; // add 2 pixels-gutters left & right 

il pulsante dovrà essere "tf.width" wide ...

+0

Perché le grondaie sono necessarie? – davidkomer

+0

Questa è una documentazione di Adobe. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/TextLineMetrics.html Adobe aggiunge 2 pixel al campo di testo. – Simmoniz

0

In seguito mio commento su s' quoo risposta, ecco il codice per lo stesso scopo, ma semplicemente afferrando la larghezza di un TextField, utilizzando TextLineMetrics così:

public function mtxtWidth(container:TextField):int { 
     var lineMetrics:TextLineMetrics = container.getLineMetrics(0); 
     return lineMetrics.width;  
    } 
1

Ecco un modo che funziona anche:

012.
var tempText:Text = new Text(); 
tempText.regenerateStyleCache(false); 
var textWidth:int = tempText.measureText(*yourstring*).width; 
1

come penso, la costruzione di textField.textWidth funziona bene ... finché non si modifica la dimensione del carattere. Sembra che calcoli la larghezza in base al font 12px. Quindi, se avete incorporato tipo di carattere e lo stile globale si può provare soluzione veloce:

var realWidth = myLabel.textField.textWidth * (fontSize/12); 

Ho provato questo sulle stringhe lunghe e corte e il risultato è corretto.

Problemi correlati