我遇到了一个奇怪的问题,使用了getCharBoundaries,我无法弄清楚从函数返回的坐标是什么坐标空间。我尝试过什么,我无法让它与我的预期相匹配。 所以我创建了一个新项目,并添加了简单的代码来突出显示文本字段中的最后一个字符,并且突然之间它运行正常。然后我尝试将导致我问题的TextField复制到新项目中。现在,相同的奇怪偏移在x轴上出现了50px。其他一切都是现货。 因此,在对两个TextFields进行比较后,我只是看不出它们的属性或转换的差异。
所以我希望有人可能现在可能会影响getCharBoundaries返回的坐标。
我正在使用Flash CS4。
答案 0 :(得分:2)
getCharBoundaries返回文本字段坐标系中的边界。原点是文本域的左角。
getCharBoundaries没有考虑滚动。你需要检查它的父(textarea)上是否有滚动条,如果是这样重新定位。一种快速的方法是使用localtoglobal和globaltolocal。使用第一个从textfield坐标系转换到应用程序坐标系,然后使用第二个从app坐标系转换到texttarea的textfield的父坐标系。我正在调整我的方法以获得字符边界我将在今天的博客上发布它
http://flexbuzz.blogspot.com/
答案 1 :(得分:2)
我刚刚遇到了完全相同的问题,并且认为我会通过提供我的发现提供帮助。在这个帖子的帮助下,我试图找到关于我正在使用的文本字段的所有“默认”。我发现当我将TextFormatAlign(或IDE中的'align')和TextFieldAutoSize属性切换为'LEFT'而不是'CENTER'时,它解决了问题。
也许游戏稍晚,但值得知道任何遇到同样问题的人。这是我能找到的唯一提出正确旗帜的线索......
答案 2 :(得分:0)
适用于我(tm)(Flex Builder AS3项目):
[Embed(systemFont="Segoe UI", fontWeight="bold", fontName="emb",
mimeType="application/x-font")]
private var EmbeddedFont:Class;
public function ScratchAs3()
{
stage.scaleMode = 'noScale';
stage.align = 'tl';
var m:Matrix = new Matrix(.8, .1, -.1, 1.1, 26, 78);
var t:TextField = new TextField();
t.autoSize = 'left';
t.wordWrap = false;
t.embedFonts = true;
t.defaultTextFormat = new TextFormat("emb", 100, 0, true);
t.transform.matrix = m;
t.text = "TEST STRING.";
addChild(t);
var r:Rectangle = t.getCharBoundaries(8);
var tl:Point = m.transformPoint(r.topLeft);
var tr:Point = m.transformPoint(new Point(r.right, r.top));
var bl:Point = m.transformPoint(new Point(r.left, r.bottom));
var br:Point = m.transformPoint(r.bottomRight);
graphics.beginFill(0xFF, .6);
graphics.moveTo(tl.x, tl.y);
graphics.lineTo(tr.x, tr.y);
graphics.lineTo(br.x, br.y);
graphics.lineTo(bl.x, bl.y);
graphics.lineTo(tl.x, tl.y);
}
要回答你的问题,它会返回TextField坐标系中的坐标,而不是它的父坐标系,它会受到DisplayObject.transform.matrix的影响,后者是.x,.y,.scaleX的支持。 scaleY,.width,.height和.rotation属性。
答案 3 :(得分:0)
解决方案是什么,添加一个新的TextField很简单,从来没有发现什么属性搞砸了所有内容。
答案 4 :(得分:0)
在大多数情况下,第一个答案是正确的。但是,如果您的字段是另一个影片剪辑的父级,它可能仍会返回错误的y坐标。试试这段代码:
//if this doesn't work:
myTextFormat = new TextFormat();
myTextFormat.align = TextFormatAlign.LEFT;
myFieldsParent.myField.autoSize = TextFieldAutoSize.LEFT;
myFieldsParent.myField.setTextFormat( myTextFormat);
//try this:
var x = myFieldsParent.myField.getCharBoundaries(o).x;
var y = myFieldsParent.myField.getCharBoundaries(o).y;
var myPoint:Point = new Point(myField.getCharBoundaries(o).x,myField.getCharBoundaries(o).y);
var pt:Point = new Point(myFieldsParent.myField.getCharBoundaries(o).x, myFieldsParent.myField.getCharBoundaries(o).y);
pt = myFieldsParent.myField.localToGlobal(pt);
//pt is the variable containing the coordinates of the char in the stage's coordinate space. You may still need to offset it with a fixed value but it should be constant.
我没有测试这段代码,因为我已经从嵌入到我项目中的代码改编了这个例子,所以如果我遗漏了某些内容,我会道歉...