lenguaje - Calcular el ancho del texto en ActionScript y Flex
as3 lenguaje (8)
Aquí hay una manera que también funciona:
var tempText:Text = new Text();
tempText.regenerateStyleCache(false);
var textWidth:int = tempText.measureText(*yourstring*).width;
Estoy tratando de calcular cuán AMPLIO es mi botón, en función del texto que contendrá, y cuando intento buscar cómo calcar algo tan simple como el ANCHO DE ALGÚN TEXTO, me vuelvo bizco tratando de vadear a través del vudú contraintuitivo esotérico aparentemente absurdo. ¿Alguien puede ayudarme a simplificar cómo escribiría una función como esta?
public function HowWideWouldThisTextBeIfItWereInThisButton(Text:String,Container:Button):int {
...
}
Gracias por adelantado.
Así Here''s como lo haces en Spark:
He modificado, simplificado, su ejemplo un poco aquí:
var textMetrics:TextLineMetrics = label.measureText( label.text );
var textWidth:int = textMetrics.width;
Esto funciona en 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 ...
Joshua, realmente ayuda 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.
Parece que podrías usar textWidth
Siempre que esté en un UIComponent, puede usar la función measureText .
public function howWideWouldThisTextBeIfItWereInThisButton(text:String,container:Button):int {
var lineMetrics:TextLineMetrics = container.measureText(text);
return lineMetrics.width;
}
Una vez dicho esto, el componente del botón de flexión debería ajustarse automáticamente al ancho del texto, si no se establece un ancho en él. De esta forma, si necesita el ancho del texto, puede llamar usando la propiedad textWidth.
Siguiendo mi comentario sobre la respuesta de quoo , aquí está el código para el mismo propósito, pero simplemente aprovechando el ancho de un TextField
, usando TextLineMetrics también:
public function mtxtWidth(container:TextField):int {
var lineMetrics:TextLineMetrics = container.getLineMetrics(0);
return lineMetrics.width;
}
como creo, la construcción textField.textWidth
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. Por lo tanto, si tiene una fuente integrada y un estilo global, puede intentar una solución rápida:
var realWidth = myLabel.textField.textWidth * (fontSize / 12);
Lo he intentado en cadenas largas y cortas, y el resultado es correcto.