我有以下设置:在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
答案 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);
}
}