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