2010-05-26 19 views
21

Estoy tratando de calcular qué tan grande para hacer mi botón, en función del texto que contendrá, y cuando trato de buscar cómo calcar algo tan simple como el ANCHO DE ALGUN TEXTO, voy con los ojos cruzados solo tratando de vadear a través del vudú contraintuitivo esotérico aparentemente absurdo. ¿Puede alguien por ahí ayudar a simplificar para mí el que me gustaría escribir una función como esta:Cálculo del ancho del texto en ActionScript y Flex

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

Gracias de antemano.

+0

Cuando dices el texto en el botón ... ¿te refieres a la etiqueta del botón? o un campo de texto o un cuadro de texto? – phwd

Respuesta

21

Mientras estás en un UIComponent, puede utilizar la función measureText.

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

Dicho esto, el componente de botón flex debería tamaño automáticamente al ancho del texto, si no se establece una anchura en él. De esta forma, si necesita el ancho del texto, puede llamar usando la propiedad textWidth.

+2

Probablemente estoy haciendo algo mal, pero obtengo: TypeError: Error # 2007: el parámetro antiAliasType no debe ser nulo. – Joshua

+0

¿Está estableciendo antiAliasType? – quoo

+0

¿QUÉ tipo de antiAlias? ¿Que es eso? ¿Dónde lo configuro? ¿Es parte de lineMetrics? ¿¿El botón?? ¿Cómo lo encuentro? – Joshua

-1

suena como usted podría utilizar textWidth

+0

¿Cómo toma esto en consideración el formato, la fuente, el tamaño y otros atributos de la etiqueta del botón? – Joshua

0

Joshua, realmente ayuda a ser claro. ¿Estás hablando de TextField, MX Label, Spark Label, RichText, etc.? Los diferentes componentes de texto utilizan diferentes motores de texto, como FTE y TLF, y pueden tener diferentes soluciones. Ciertamente me gustaría que Adobe tuviera un buen conjunto de utilidades o un código de muestra que pudiera predecir cuál sería el tamaño de la fuente representada en los controles, antes de que realmente lo haga. Pero la buena noticia es que, en ciertos casos, como un buen TextField pasado de moda, puedes predecirlo bastante bien. Simplemente crea un TextField, configura su campo textFormat, el método de tamaño automático y el texto. Debería poder obtener su tamaño antes de agregarlo a cualquier lugar. No recuerdo cuál era el pedido, pero recuerdo que importa el orden en que establezca esas propiedades. Si no puede encontrar la manera de hacerlo, puedo proporcionar un ejemplo de código. Ahora, para los componentes nuevos, "mejorados", como Spark Labels: me molestarán si puedo encontrar una maldita manera ... pasé varias horas en esto y no he encontrado una manera ... o alguien que sabe una manera: P.

2

Here's cómo lo hace en Spark:

He modificado - simplificado - su ejemplo un poco aquí:

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

Esto funciona cualquier formato, tamaño, tipo de letra. ¡No olvide las propiedades "autoSize" y "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 

Su botón tendrá que ser "tf.width" de ancho ...

+0

¿Por qué son necesarios los canales? – davidkomer

+0

Esto es de la documentación de Adobe. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/TextLineMetrics.html Adobe agrega 2 píxeles alrededor del campo de texto. – Simmoniz

0

seguimiento mi comentario sobre quoo 's respuesta, aquí está el código para el mismo propósito, pero sólo sacar la anchura de un TextField, utilizando TextLineMetrics así:

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

Aquí está una manera que funcione también:

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

como creo, textField.textWidth la construcción funciona bien ... hasta que cambie el tamaño de la fuente. Parece que calcula el ancho en función de la fuente de 12 píxeles. lo tanto, si usted ha incorporado la fuente y el estilo global a la que puede probar solución rápida:

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

He intentado esto en cadenas largas y cortas y el resultado es correcto.

Cuestiones relacionadas