getCharBoundaries上的神秘坐标偏移量

时间:2009-06-19 02:13:14

标签: flex flash actionscript-3 text

我遇到了一个奇怪的问题,使用了getCharBoundaries,我无法弄清楚从函数返回的坐标是什么坐标空间。我尝试过什么,我无法让它与我的预期相匹配。 所以我创建了一个新项目,并添加了简单的代码来突出显示文本字段中的最后一个字符,并且突然之间它运行正常。然后我尝试将导致我问题的TextField复制到新项目中。现在,相同的奇怪偏移在x轴上出现了50px。其他一切都是现货。 因此,在对两个TextFields进行比较后,我只是看不出它们的属性或转换的差异。

所以我希望有人可能现在可能会影响getCharBoundaries返回的坐标。

我正在使用Flash CS4。

5 个答案:

答案 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.

我没有测试这段代码,因为我已经从嵌入到我项目中的代码改编了这个例子,所以如果我遗漏了某些内容,我会道歉...