AS3 - 为什么在设置TextField的文本后清除字体?

时间:2016-03-30 18:01:26

标签: actionscript-3 flash fonts textfield

我有以下设置:在Label.fla中有一个包含TextField的MovieClip,它的类设置为src.components.Label。所有这个类都在构造函数中设置字体,然后将TextField的text属性设置为空字符串(字符串的值对于此问题不重要。它可以是非空字符串并且具有相同的结果)。像这样:

package src.components
{
    import flash.display.MovieClip;
    import flash.text.TextFormat;
    import flash.text.TextField;

    public class Label extends MovieClip
    {
        public var mTextField:TextField;

        public function Label()
        {
            super();

            var tf:TextFormat = new TextFormat("Arial", 34, 0xFFFFFF);
            mTextField.defaultTextFormat = tf;
            mTextField.setTextFormat(tf);

            trace("init before: " + mTextField.getTextFormat().font);
            mTextField.text = "";
            trace("init after: " + mTextField.getTextFormat().font);
        }
    }
}

Label.fla中的label对象设置为导出以进行运行时共享,该对象已复制到MainMenu.fla中。这个标签的一个实例放在MainMenu.fla的舞台上,当我运行MainMenu.swf时,输出清楚地显示正在设置字体,然后立即清除,因为我正在更改文本属性TextField更新。

输出如下:

init before: Arial
init after: null

为什么设置文本会导致字体被清除?这给我带来了很多问题。我弄清楚如何解决这个问题的唯一方法是在设置文本,设置文本,然后重新应用复制的TextFormat以确保它没有&#之前,在我制作TextFormat对象副本的地方做一些愚蠢的事情。 39;改变。

我附上了一个包含所有源文件和已编译文件的zip文件,以便对其进行测试。 FontTest.zip

2 个答案:

答案 0 :(得分:2)

这个问题的答案非常简短:

  • 因为您没有阅读文档。

这是您代码中唯一的问题。您正在使用一种方法(setTextFormat(tf)),该方法仅用于设置当前现有文本的格式。这当然是在文档中指定的。

为任何未来设置文本设置格式的一种方法是:" defaultTextFormat"。这再次在文档中指定,此方法不会修改已在文本字段中设置的文本。

所以2个方法意味着2个不同的东西,一个(你使用的那个)用于修改现有文本,一个" defaultTextFormat"用于修改任何未来文本。

但是真正阅读文档会让你找到SO之旅,阅读as3文档并回答99%的未来问题和问题。

答案 1 :(得分:1)

扩展BotMaster发布的内容,我重新阅读文档并找出了我误解的地方。如果要在使用defaultTextFormat时保持文本格式,则可以使用setSelection()后跟replaceSelectedText()来设置文本。所以固定构造函数如下所示:

public function Label()
{
    super();

    var tf:TextFormat = new TextFormat("Arial", 34, 0xFFFFFF);
    mTextField.defaultTextFormat = tf;

    trace("init before: " + mTextField.getTextFormat().font);
    mTextField.setSelection(0, mTextField.length);
    mTextField.replaceSelectedText("");
    trace("init after: " + mTextField.getTextFormat().font);
}

这会生成以下输出:

init before: Bender
init after: Arial

Bender是FLA中设置的字体,因此是预期的起始值。

作为替代解决方案,您可以存储TextFormat对象,并在设置text属性后应用它,但我不确定哪个更有效。该解决方案看起来像这样:

public class Label extends MovieClip
{
    public var mTextField:TextField;
    private var mTextFormat:TextFormat = null;

    public function Label()
    {
        super();

        // Storing this in a member so that anywhere in this class that you change the text
        // you can just apply it without having to reconstructing it.
        mTextFormat = new TextFormat("Arial", 34, 0xFFFFFF);

        trace("init before: " + mTextField.getTextFormat().font);
        mTextField.text = "";
        mTextField.setTextFormat(mTextFormat);
        trace("init after: " + mTextField.getTextFormat().font);
    }
}