Wprowadzam dropDownList z arrayCollection of string. Chcę, aby szerokość kontrolki listy rozwijanej była zgodna z rozmiarem (w pikselach) najdłuższego ciągu w kolekcji tablic. Problem z którym stoję, to: szerokość czcionki łańcuchów w kolekcji jest różna. "W" wygląda szerzej niż "l". Tak więc oszacowałem szerokość znaku na 8 pikseli, ale to nie jest miłe. Jeśli napotkasz łańcuch, który ma wiele "W" i "M", szacowanie jest błędne. Dlatego potrzebuję dokładnej szerokości piksela ciągów. Jak mogę uzyskać dokładną długość napisu w pikselach?Długość ciągu w pikselach
Moje rozwiązanie, które szacuje się cały charakter 8 pikseli szerokości podana jest poniżej:
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);
}
Każdy pomysł lub rozwiązanie jest wysoko cenione.
Dzięki
@Rose Uważasz, że musisz dodać wywołanie validateNow() po przypisaniu ciągu znaków, ale przed sprawdzeniem textWidth/textHeight przypisanie ciągu powoduje unieważnienie rozmiaru, ale ponowne obliczenie rozmiaru nie jest zsynchronizowany, więc musisz wymusić walidację – shaunhusain
Świetnie! Podobało mi się rozwiązanie; Mam jednak mały problem. Nie ma odpowiedniej szerokości piksela. Dałem jej ten ciąg w tablicy. var struny: Array = ["a", "giraffe", "foo", "Obiekt ArrayCollection nie reprezentuje żadnych"]; Teraz szerokość tekstu wynosiła 245, ale w rzeczywistości rozmiar wynosił 276. Tak więc na mojej liście rozwijanej pojawi się pasek przewijania.Z twojego kodu usunąłem część, która ma textformat, więc zrobiłem funkcję measureStr funkcją argumentu 1 – Rose
@Rose: TextFormat wpływa na czcionkę (-face i -family), która jest używana podczas pomiaru tekstu - powinna zostać zmieniona aby dokładnie pasować do listy rozwijanej (chociaż nie jestem pewien co to jest). Po usunięciu elementów textFormat, czy ma odpowiednią długość? Jeśli tak, podejrzewam, że tak jest, ponieważ domyślny format tekstu jest taki sam, jak używany na liście rozwijanej. – Cameron