2010-05-26 25 views
21

Tôi đang cố gắng tính toán cách WIDE thực hiện nút của mình, dựa trên văn bản mà nó sẽ chứa và khi tôi cố gắng tìm cách làm nổi bật thứ gì đó đơn giản như WIDTH OF SOME VĂN BẢN, tôi đi qua mắt chỉ cố gắng lội qua dường như vô nghĩa bí truyền truy cập trực quan. Bất kỳ ai có thể giúp đơn giản hóa cho tôi cách tôi sẽ viết một chức năng như thế này:Tính chiều rộng văn bản trong ActionScript và Flex

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

Xin cảm ơn trước.

+0

Khi bạn nói văn bản trong nút ... bạn có nghĩa là nhãn cho nút không? hoặc một trường văn bản hoặc một hộp văn bản? – phwd

Trả lời

21

Vì vậy, miễn là bạn đang ở trong một UIComponent, bạn có thể sử dụng chức năng measureText.

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

Điều đó được nói, thành phần nút flex sẽ tự động kích thước theo chiều rộng của văn bản, nếu bạn không đặt chiều rộng trên văn bản. Bằng cách đó nếu bạn cần chiều rộng văn bản, bạn chỉ có thể gọi sử dụng thuộc tính textWidth.

+2

Tôi có thể làm điều gì đó sai, nhưng tôi nhận được: LoạiError: Lỗi # 2007: Tham số antiAliasType phải không null. – Joshua

+0

Bạn có đang đặt antiAliasType không? – quoo

+0

WHAT antiAliasType LÀ GÌ? Đó là gì? Tôi đặt nó ở đâu? Nó là một phần của lineMetrics? Nút ?? Làm thế nào để tôi tìm thấy nó? – Joshua

-1

Âm thanh như bạn có thể sử dụng textWidth

+0

Làm cách nào để xem xét định dạng, phông chữ, kích thước và các thuộc tính khác của nhãn nút? – Joshua

0

Joshua, nó thực sự giúp làm rõ. Bạn đang nói TextField, MX Label, Spark Label, RichText, vv? Các thành phần văn bản khác nhau sử dụng các công cụ văn bản khác nhau, chẳng hạn như FTE và TLF và có thể có các giải pháp khác nhau. Tôi chắc chắn muốn Adobe có một bộ tiện ích hoặc mã mẫu tốt có thể dự đoán kích thước phông chữ được hiển thị trên các điều khiển sẽ là gì, trước khi bạn thực sự làm điều đó. Nhưng, tin tốt là trong một số trường hợp - giống như, một TextField thời trang cũ, bạn có thể dự đoán điều này khá tốt. Bạn chỉ cần tạo TextField, đặt trường textFormat, phương thức kích thước tự động và văn bản. Bạn sẽ có thể nhận được kích thước của nó trước khi thêm nó bất cứ nơi nào. Tôi không nhớ thứ tự là gì, nhưng, tôi nhớ thứ tự bạn đặt những đặc tính đó là quan trọng. Nếu bạn không thể tìm ra cách để làm điều đó, tôi có thể cung cấp một ví dụ mã. Bây giờ, đối với các thành phần mới, "được cải tiến", chẳng hạn như Nhãn Spark - Tôi sẽ bị lỗi nếu tôi có thể tìm thấy một cách chết tiệt ... đã dành một số giờ và không tìm được cách nào .. hoặc người nào đó biết một cách: P.

2

Here's cách bạn làm điều đó trong Spark:

Tôi đã sửa đổi - đơn giản - ví dụ mình một chút ở đây:

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

này hoạt động bất kỳ định dạng, kích thước, kiểu font. Đừng quên các thuộc tính "autoSize" và "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 

nút của bạn sẽ cần phải "tf.width" rộng ...

+0

Tại sao máng nước cần thiết? – davidkomer

+0

Đây là tài liệu của Adobe. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/TextLineMetrics.html Adobe thêm 2 pixel xung quanh trường văn bản. – Simmoniz

0

Theo dõi nhận xét của tôi trên câu trả lời quoo 's, đây là mã cho cùng một mục đích, nhưng chỉ cần grabbing chiều rộng ra khỏi một TextField, sử dụng TextLineMetrics cũng như:

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

đây là một cách làm việc cũng:

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

như tôi nghĩ, textField.textWidth xây dựng hoạt động tốt ... cho đến khi bạn thay đổi kích thước phông chữ. Dường như nó tính toán chiều rộng dựa trên phông chữ 12px. Vì vậy, nếu bạn đã nhúng phông chữ và phong cách toàn cầu bạn có thể thử giải pháp nhanh:

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

Tôi đã thử này trên dây dài và ngắn và kết quả là chính xác.

Các vấn đề liên quan