2009-06-19 4 views
0

getCharBoundariesで奇妙な問題に遭遇しましたが、関数から返された座標がどの座標空間にあるのか分かりませんでした。何を試してみましたか私は期待した。 私は新しいプロジェクトを作って、テキストフィールドの最後のチャーターを強調するための簡単なコードを追加しました。私は問題を引き起こしていたTextFieldを新しいプロジェクトにコピーしようとしました。そして今、同じ奇妙なオフセットがx軸に50ピクセルで現れました。他にはすべてがスポットであった。 2つのTextFieldを比較していくつかの頭出しをした後、私は単にプロパティまたは変換の違いを見ることができません。getCharBoundariesのミステリー座標オフセット

私は誰かがgetCharBoundariesによって返された座標にどのような特性が影響するかもしれないことを期待していました。

私はFlash CS4を使用しています。ミー

答えて

2

私はちょうど同じ問題を抱えていて、私の発見が何であるかを提示することによって助けてくれると思っていました。このスレッドの助けを借りて、私が使用していたテキストフィールドについて「デフォルト」でないものをすべて見つけようとしました。私は、 'CENTER'ではなく、TextFormatAlign(またはIDEで 'align')とTextFieldAutoSizeプロパティを 'LEFT'に切り替えると、問題を解決したことがわかりました。

おそらくゲームで少し遅れているかもしれませんが、同じ問題を抱えている人は誰でも知る価値があります。これは私が見つけることができる唯一のスレッドでした右の旗を提起...

+0

そのような音が答えになるかもしれません。誰かがこの質問に来る場合に備えて、私はあなたに答えをあげます。 –

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プロパティのバッキングです。

+0

私が得た:このコードを試してみてください新しいTextFieldで作業していること、返されたx座標に何が影響するかを知りたいだけです。 私はすでにスケーリングをチェックしていますが、座標には影響しますが、ここでは原因はありません。 –

2

まあ、getCharBoundariesは、テキストフィールド座標系の境界を返します。原点はテキストフィールドの上端角です。
getCharBoundariesはスクロールを考慮しません。その親(テキストエリア)にスクロールバーがあるかどうかを確認し、そうであれば再配置する必要があります。これを行う簡単な方法の1つは、localtoglobalとglobaltolocalを使用することです。最初のテキストフィールドを使用してテキストフィールド座標系からアプリケーション座標系に変換し、次に2番目の座標系を使用してアプリケーション座標系からテキスト領域のテキストフィールドの親の座標系に変換します。私はそれが解決策は、新しいTextFieldを追加するために簡単だったし、これまで何 http://flexbuzz.blogspot.com/

+0

良い提案ですが、問題ではありませんでした。しかし、私が書いたように、それはTextFieldのプロパティでした。しかし、それは決して見つかりませんでした。 –

0

私のブログに今日それを公開する文字の境界を取得するための私の方法微調整だよ、すべてを台無しにどのような性質が分かったことはありません。

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. 

...