我有一个设置高度和宽度的文本字段,允许自动换行。当我向其添加文本时,我会动态更改字体大小,直到文本的高度小于框的高度,从而使其正确适合。我遇到的问题是盒子必要时相当薄,而且在自动换行期间会破坏一些较长的单词(如“澳大利亚”)。所以,也许“Australi”将出现在第一行,而“a”出现在第二行。但是,因为它们满足高度要求,所以它们不再缩小。我需要一种方法来检测这种情况并继续缩小这些情况,以便它们能够在没有中断的情况下适应。以下是动态缩小文本以适应高度的代码:
text.wordWrap = true;
text.autoSize = TextFieldAutoSize.CENTER;
while(text.height > textBoxVal) {
myFormat.size = Number(myFormat.size) - 2;
text.defaultTextFormat = myFormat;
text.setTextFormat(myFormat);
}
这很好用。我对下一步的处理方法的问题(如果因为一个单词被拆分而不能满足水平约束,则会缩小)是通过将text.wordWrap
设置为true,较长的单词仍然会中断并且永远不会调整大小,而是设置它是假的意味着之前由于自动换行而被打开的其他盒子(如“美国”)现在在一条线上太长了,并且当它们不应该缩小时缩小。对于它的价值,这是我的代码水平收缩(紧接在上面的代码之后):
text.wordWrap = false;
text.autoSize = TextFieldAutoSize.LEFT;
while(text.width > textBoxVal) {
myFormat.size = Number(myFormat.size) - 2;
text.defaultTextFormat = myFormat;
text.setTextFormat(myFormat);
}
还有更好的方法吗?也许某种方法可以强制ActionScript不要破坏单词等?
修改:举个例子,请看下面的截图:
这仅使用第一个代码块,它确保文本适合框的垂直约束。你可以看到一些盒子(比如美国的第一个盒子)很好,而一些较小的盒子(比如最后几个)是分开的。使用我的第二个代码块来调整水平约束的大小,如果自动换行为真,则不会进行任何更改,并且如果自动换行设置为false,则会使所有框(包括那些很好的框,如美国)小于所需的框。
答案 0 :(得分:4)
如果您的文字换行到另一行,您应该可以 检查maxScrollV。
我的猜测如下:
while((text.height > textBoxVal || text.maxScrollV > 1) && myFormat.size > 1) {
myFormat.size = Math.max(1, Number(myFormat.size) - 2);
text.defaultTextFormat = myFormat;
text.setTextFormat(myFormat);
}
修改强>
我的建议是
以下是一些代码来说明:
private function fitText (text:String, rect:Rectangle, tf:TextField, format:TextFormat) : void
{
// split text by whitespace
var heap:Array = text.split(/\s+/);
var size:uint = format.size;
var maxScroll:uint = 1;
var text:String;
var word:String;
// make sure tf is set up correctly
tf.defaultTextFormat = format;
tf.setTextFormat(format);
tf.multiline = true;
tf.wordWrap = true;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.width = rect.width;
for (var i:uint = 0; i<heap.length;i+=1) {
// insert text word by word
word = heap[i];
text = tf.text;
if (i) {
tf.text = text + " " + word;
} else {
tf.text = word;
}
if (tf.maxScrollV > maxScroll) {
// the last word you inserted increased number of lines
// and possibly got broken
// increase scroll by 1
// if scroll actually increased by more than 1,
// we got word broken multiple times
maxScroll += 1;
// insert implicit line break, if not the first word
if (i) {
tf.text = text + "\n" + word;
}
}
// do the resizing routine, if needed
while (tf.height > rect.height || tf.maxScrollV > maxScroll) {
// we also check tf.maxScrollV,
// as it can be no more than maxScroll.
// otherwise we'll get words crippled
/*resizing code here*/
}
}
// restore original size
format.size = size;
}
答案 1 :(得分:1)