Смещение координат тайны на getCharBoundaries - PullRequest
0 голосов
/ 19 июня 2009

Я столкнулся со странной проблемой с getCharBoundaries, я не мог понять, в каком координатном пространстве находились координаты, возвращаемые функцией. Что бы я ни пытался, я не мог заставить его соответствовать тому, что я ожидал. Поэтому я сделал новый проект и добавил простой код, чтобы выделить последний символ в текстовом поле, и вдруг все заработало нормально. Затем я попытался скопировать текстовое поле, которое вызывало у меня проблемы, в новый проект. И теперь то же самое странное смещение появилось 50px на оси x. Все остальное было на месте. Поэтому, после некоторого сравнения голов в TextFields, я просто не вижу разницы в их свойствах или преобразованиях.

Так что я надеялся, что кто-то может узнать, какое свойство может повлиять на координаты, возвращаемые getCharBoundaries.

Я использую Flash CS4.

Ответы [ 5 ]

2 голосов
/ 27 апреля 2011

У меня точно такая же проблема, и я решил помочь, предложив свои выводы. С помощью этой ветки я попытался найти все, что не было «по умолчанию» в текстовом поле, которое я использовал. Я обнаружил, что когда я переключил свойства TextFormatAlign (или «выровнять» в IDE) и TextFieldAutoSize на «ВЛЕВО», а не «ЦЕНТР», это решило проблему.

Возможно, немного поздно в игре, но это стоит знать любому, кто столкнулся с той же проблемой. Это была единственная нить, которую я мог найти, которая подняла правильный флаг ...

2 голосов
/ 06 октября 2009

Хорошо, getCharBoundaries возвращает границы в системе координат текстового поля. Где источник - верхний угол текстового поля.
getCharBoundaries не учитывает прокрутку. вам нужно проверить, есть ли полосы прокрутки на его родительском элементе (textarea) и, если это так, переместить. Один из быстрых способов сделать это - использовать localtoglobal и globaltolocal. Используйте первое для перевода из системы координат текстового поля в систему координат приложения, а затем используйте второе для перевода из системы координат приложения в систему координат родителя текстового поля, которое является текстовой областью. Я хорошо настраиваю свой метод, чтобы получить границы символов, я опубликую это сегодня в моем блоге http://flexbuzz.blogspot.com/

0 голосов
/ 15 ноября 2013

Первый ответ правильный в большинстве случаев. Однако, если ваше поле связано с другим фрагментом ролика, оно все равно может вернуть неправильную координату 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.

Я не тестировал этот код, так как я адаптировал этот пример из кода, встроенного в мой проект, поэтому я извиняюсь, если что-то упустил ...

0 голосов
/ 10 февраля 2010

Какое бы это ни было решение, было просто добавить новый TextField, так и не узнав, какое свойство все испортило.

0 голосов
/ 19 июня 2009

Works For Me (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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...