我计划为媒体播放器安排一个简单的进度栏,绘制一个彩色矩形,然后根据需要更改其width属性。外观上看起来不错-可以很好地缩放(我无法以零宽度绘制它,所以我指定了最小值0.1)。
但是,实际问题有所不同,并且看起来很奇怪,或者至少绝对不明显。由于我需要监视进度条上的用户点击,以支持媒体流中的搜索操作,因此我想-我将检测点击事件,将x坐标作为与父DisplayObject的偏移量,重新计算时间并进行搜索。现在事实证明,该event.localX不会真正与Sprite一起“缩放”。就像我说的,进度条的最右x坐标最初是0.1,并且无论实际条变为多大,它都会保持这种方式(!)-5,100,1000。如果单击该条的最右像素,则为-0.1!
?? ..
我显然做错了。也许有一种方法,例如-refreshCoordinates()或其他方法?它是什么?..
最佳答案
了解为什么会发生对于理解Flash的工作方式非常重要。关键是要认识到每个显示对象都有其自己的坐标系,并且当您的范围位于该系统内时,对象本身是否旋转,缩放等都无关紧要。如果您居住在条形图中,那么您所知道的一切是图形的宽度为0.1像素,并且在右边框上单击了。您不知道您居住的显示对象是否已在层次结构中的某个位置拉伸或变换。这就是为什么您要查看的事件属性称为localX
的原因-它告诉您单击在该显示对象中本地发生的位置。
因此,在这种情况下,通常将条形图的宽度设置为100像素,然后根据需要在舞台上调整其大小。如果图形内部为100像素,并且您检测到该范围内的点击,则可以将localX
视为一个百分比。然后,如果您重新设计页面并更改条形的可视宽度,则无需触摸代码。
顺便说一句,如果要将位置从一个坐标系转换到另一个坐标系,只需将localToGlobal
和globalToLocal
一起使用。那是:
var localToThis:Point = new Point( someX, someY );
var globalToStage:Point = localToGlobal( localToThis );
var localToParent:Point = parent.globalToLocal( globalToStage );
(或者,解决问题的另一种方法是简单地捕获显示层次结构中更深的点击事件,其中的条实际上是100px宽,而不是在图形内部没有的地方。)
最后一点:不要养成0.1像素宽的图形的习惯。使用与渲染相关的值(例如
x
,rotation
等),Flash有时会出于性能原因四舍五入,使其大小在视觉上可分辨的以下。只需将对象设置为100px或任何大小,然后将其转换为任意大小即可。关于actionscript-3 - 嗯?event.localX在缩放的Sprite上保留“比例”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4453762/