ActionScript的WordWrap打破了单词

时间:2011-06-29 13:36:05

标签: flash actionscript-3 actionscript word-wrap

我有一个设置高度和宽度的文本字段,允许自动换行。当我向其添加文本时,我会动态更改字体大小,直到文本的高度小于框的高度,从而使其正确适合。我遇到的问题是盒子必要时相当薄,而且在自动换行期间会破坏一些较长的单词(如“澳大利亚”)。所以,也许“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不要破坏单词等?

修改:举个例子,请看下面的截图:

enter image description here

这仅使用第一个代码块,它确保文本适合框的垂直约束。你可以看到一些盒子(比如美国的第一个盒子)很好,而一些较小的盒子(比如最后几个)是分开的。使用我的第二个代码块来调整水平约束的大小,如果自动换行为真,则不会进行任何更改,并且如果自动换行设置为false,则会使所有框(包括那些很好的框,如美国)小于所需的框。

2 个答案:

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

修改

我的建议是

  1. 逐字逐句地将文字添加到字段中
  2. 如果maxScrollV发生变化,您将获得自动自动换行
  3. 插入隐式换行符
  4. 调整文字大小以适合所需的高度
  5. 重复,直到所有单词都没有
  6. 以下是一些代码来说明:

    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)

Skim over this,它可以帮助您检测情况。

要特别注意他必须等待1帧才能检测到不需要的换行符。

你检测到它的第二个然后你可以再缩小一点并重新检测到令人讨厌的换行符。

http://troyworks.com/blog/2011/06/09/flash-as3-detect-undesired-line-break-in-textfield-wordwrap-is-true/