Estoy rellenando un dropDownList con arrayCollection de cadenas. Quiero que el ancho del control de la lista desplegable coincida con el tamaño (en píxeles) de la cadena más larga de la colección de matriz. El problema al que me enfrento es: el ancho de la fuente de las cadenas en la colección es diferente, p. 'W' parece más ancho que 'l'. Así que calculé que el ancho de un personaje es de 8 píxeles, pero eso no es muy bonito. Si se encuentra una cadena que tiene muchas 'W' y 'M', la estimación es incorrecta. Así que quiero un ancho de píxel preciso de las cadenas. ¿Cómo puedo obtener la longitud exacta de una cadena en píxeles?Longitud de una cadena en píxeles
Mi solución que estima todos los caracteres a ser de 8 píxeles de ancho se da a continuación:
public function populateDropDownList():void{
var array:Array = new Array("o","two","three four five six seven eight wwww");
var sampleArrayCollection:ArrayCollection = new ArrayCollection(array);
var customDropDownList:DropDownList = new DropDownList();
customDropDownList.dataProvider=sampleArrayCollection;
customDropDownList.prompt="Select ...";
customDropDownList.labelField="Answer Options:";
//calculating the max width
var componentWidth=10; //default
for each(var answerText in array){
Alert.show("Txt size: "+ answerText.length + " pixels: " + answerText.length*9);
if(answerText.length * 8 > componentWidth){
componentWidth=answerText.length * 8;
}
}
customDropDownList.width=componentWidth;
answers.addChild(customDropDownList);
}
Cualquier idea o solución es muy valorada.
Gracias
@Rose Cree que necesita agregar una llamada validateNow() después de asignar la cadena, pero antes de comprobar el texto Ancho/textoAlta la asignación de la cadena provoca la invalidación del tamaño pero el recálculo del tamaño no es síncrono, por lo que debe forzar la validación – shaunhusain
¡Genial! Me gustó la solución; tengo un pequeño problema sin embargo. No está obteniendo el ancho de píxel correcto. Le di esta cadena en la matriz. var strings: Array = ["a", "jirafa", "foo", "El objeto ArrayCollection no representa ninguno"]; Ahora tiene el ancho de texto en 245, pero de hecho el tamaño era 276. Entonces aparece una barra de desplazamiento en mi lista desplegable.De su código eliminé la parte que tiene textFormat, así que hice que la función measureStr sea una función de argumento – Rose
@Rose: The TextFormat afecta la fuente (-face y -family) que se usa al medir el texto - debe cambiarse para que coincida exactamente con el de la lista desplegable (aunque no estoy seguro de qué es eso). Después de eliminar el material textFormat, ¿le da la longitud correcta? Si es así, sospecho que es porque el formato de texto predeterminado es el mismo que el que se está usando en la lista desplegable. – Cameron