Search code examples
actionscript-3stringfontsdrop-down-menuflex4

Length of a string in pixels


I'm populating a dropDownList with arrayCollection of strings. I want the width of the drop down list control to match with the size (in pixels) of the longest string in the array collection. The problem I'm facing is: the font width of the strings in the collection are different e.g. 'W' looks wider than 'l'. So I estimated the width of a character to be 8 pixels but that's not pretty neat. If a string that has many 'W' and 'M' is encountered the estimation is wrong. So I want precise pixel width of strings. How can i get the exact length of a string in pixels??

My solution that estimates all character to be 8 pixels wide is given below:

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);
   }

Any idea or solution is highly valued.

Thanks


Solution

  • To get a more accurate measurement, you can populate a TextField with the string, then measure the width of that TextField's text.

    Code:

    function measureString(str:String, format:TextFormat):Rectangle {
        var textField:TextField = new TextField();
        textField.defaultTextFormat = format;
        textField.text = str;
    
        return new Rectangle(0, 0, textField.textWidth, textField.textHeight);
    }
    

    Usage:

    var format:TextFormat = new TextFormat();
    format.font = "Times New Roman";
    format.size = 16;
    
    var strings:Array = [ "a", "giraffe", "foo", "!" ];
    
    var calculatedWidth:Number = 50;    // Set this to minimum width to start with
    
    for each (var str:String in strings) {
        var stringWidth:Number = measureString(str, format).width;
        if (stringWidth > calculatedWidth) {
            calculatedWidth = stringWidth;
        }
    }
    
    trace(calculatedWidth);