Да?! .. event.localX сохраняет "пропорции" в масштабируемом Sprite? - PullRequest
3 голосов
/ 15 декабря 2010

Я планировал расположить простой индикатор выполнения для своего медиаплеера, нарисовав цветной прямоугольник, а затем изменив его свойство width по мере необходимости. Визуально это выглядит нормально - хорошо масштабируется (я не мог нарисовать его с нулевой шириной, поэтому я назначил минимальное значение 0,1).

Реальная проблема другая, хотя и кажется очень странной или, по крайней мере, абсолютно не очевидной. Так как мне нужно отслеживать клики пользователей на этом индикаторе выполнения, чтобы поддержать операцию поиска в потоке мультимедиа, я подумал - я бы обнаружил событие клика, принял бы координату x в качестве смещения от родительского DisplayObject, пересчитал во время и сделал поиск. Теперь оказывается, что event.localX не «масштабируется» вместе со Sprite. Как я уже сказал, самая правильная координата x для индикатора выполнения изначально равна 0,1, и она остается такой (()), независимо от того, насколько широкой станет реальная полоса - 5, 100, 1000. Если щелкнуть самый правый пиксель панели , будет - 0,1!

А? .. * * 1005

Я явно что-то не так делаю. Может быть, есть метод, например - refreshCoordinates () или что-то? Что это? ..

Ответы [ 3 ]

2 голосов
/ 16 декабря 2010

Понимание того, почему это происходит, очень важно для понимания того, как работает Flash. Главное - осознать, что каждый экранный объект имеет свою собственную систему координат, и когда ваша область видимости находится внутри этой системы, не имеет значения, вращается ли, масштабируется ли сам объект и т. Д. Если вы живете внутри гистограммы, все, что вы знаете является то, что изображение имеет ширину 0,1 пикселя, и что щелчок произошел на правой границе. Вы не представляете, был ли экранный объект, в котором вы живете, растянут или преобразован где-то вверх по иерархии. Вот почему свойство события, которое вы просматриваете, называется localX - оно сообщает вам, где произошел щелчок локально , внутри этого экранного объекта.

Вот почему в этой ситуации очень распространено сделать гистограмму шириной 100 пикселей, а затем изменить ее размер так, как вы хотите на сцене. Если внутреннее изображение составляет 100px, и вы обнаруживаете клики в этой области, то вы можете рассматривать localX как процент. И если вы затем измените дизайн страницы и измените визуальную ширину полосы, вам не нужно трогать код.

Кстати, если вы хотите преобразовать местоположение из одной системы координат в другую, просто используйте localToGlobal и globalToLocal вместе. То есть:

var localToThis:Point = new Point( someX, someY );
var globalToStage:Point = localToGlobal( localToThis );
var localToParent:Point = parent.globalToLocal( globalToStage );

(Или другой способ решения вашей проблемы - просто зафиксировать события щелчка дальше по иерархии отображения, где полоса действительно имеет ширину 100 пикселей, а не внутри графика, где ее нет.)

Последнее замечание: не привыкать делать графику шириной 0,1 пикселя. Со значениями, связанными с рендерингом, такими как x, rotation и т. Д., Flash иногда округляет вещи из соображений производительности, ниже размеров, которые визуально различимы. Просто сделайте объект размером 100px или как-нибудь еще и преобразуйте его так, чтобы он был как можно меньше.

1 голос
/ 15 декабря 2010

Полагаю, это как-то связано с глобальными или локальными координатами.Почему бы вам не попробовать LocalToGlobal метод? Здесь - статья, объясняющая функцию.

0 голосов
/ 16 декабря 2010

Я никогда не сталкивался с этим раньше, но это выглядит странно.Мне удалось воспроизвести проблемный рисунок с помощью объекта graphics, а затем изменить ширину спрайта.

В любом случае, есть простой обходной путь.Нарисуйте свой бар с максимальной шириной впереди, а затем масштабируйте его.Примерно так:

var sp:Sprite = new Sprite();

sp.graphics.beginFill(0xff0000);
sp.graphics.drawRect(0,0,200,30);
sp.graphics.endFill();
sp.scaleX = 0;

sp.addEventListener(Event.ENTER_FRAME,handleEnterFrame);
sp.addEventListener(MouseEvent.CLICK,handleClick);
addChild(sp);

function handleClick(e:MouseEvent):void {
    trace(e.localX);
}

function handleEnterFrame(e:Event):void {
    sp.scaleX += 0.01;
}

Я использую фрейм ввода для симуляции прогресса, но дело в том, что вы обновляете scaleX вместо width спрайта, чтобы отражать прогресс.1009 *

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