Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 呵呵?!。。event.localX保留“事件”;比例“;在雪碧上?_Actionscript 3_Events_Scaling - Fatal编程技术网

Actionscript 3 呵呵?!。。event.localX保留“事件”;比例“;在雪碧上?

Actionscript 3 呵呵?!。。event.localX保留“事件”;比例“;在雪碧上?,actionscript-3,events,scaling,Actionscript 3,Events,Scaling,我计划为我的媒体播放器安排一个简单的进度条,画一个彩色矩形,然后根据需要更改它的宽度属性。从视觉上看,它看起来还可以——缩放得很好(我不能用零宽度绘制它,所以我将最小值指定为0.1) 但真正的问题是不同的,看起来很奇怪,或者至少绝对不明显。由于我需要监控用户在进度条上的点击,为了支持媒体流中的搜索操作,我想-我会检测点击事件,将x坐标作为父DisplayObject的偏移量,重新计算时间并进行搜索。现在证明,event.localX并没有真正随着精灵“缩放”。正如我所说,进度条最右边的x坐标最初

我计划为我的媒体播放器安排一个简单的进度条,画一个彩色矩形,然后根据需要更改它的宽度属性。从视觉上看,它看起来还可以——缩放得很好(我不能用零宽度绘制它,所以我将最小值指定为0.1)

但真正的问题是不同的,看起来很奇怪,或者至少绝对不明显。由于我需要监控用户在进度条上的点击,为了支持媒体流中的搜索操作,我想-我会检测点击事件,将x坐标作为父DisplayObject的偏移量,重新计算时间并进行搜索。现在证明,event.localX并没有真正随着精灵“缩放”。正如我所说,进度条最右边的x坐标最初是0.1,不管实际的进度条有多宽,它都会保持这种状态(!)。如果单击该条最右边的像素,它将为-0.1


我显然做错了什么。也许有一个方法,比如-refreshCoordinates()或其他什么?这是什么?。

我猜这与全球坐标和本地坐标有关。为什么不试试
LocalToGlobal
方法呢?是一篇解释函数的文章。

我以前从未遇到过这个,但它看起来确实很奇怪。我能够通过
图形
对象再现问题图形,然后更改精灵宽度

无论如何,有一个简单的解决办法。以“最大宽度”向上绘制条形图,然后缩放它。大概是这样的:

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;
}

我使用enter帧来模拟进度,但关键是要更新精灵的
scaleX
,而不是
width
,以反映进度。

了解为什么会发生这种情况对于了解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 );
(或者,解决问题的另一种方法是简单地捕获显示层次结构上的点击事件,其中条形图的宽度实际上是100px,而不是在图形中的宽度不是100px。)


最后一点注意:不要养成制作0.1像素宽的图形的习惯。使用与渲染相关的值,例如
x
旋转
,Flash有时会出于性能原因而舍入一些值,使其小于视觉上可分辨的大小。只需将对象设置为100px或其他大小,并将其转换为您喜欢的大小。

是的。谢谢就这样。看起来变换后的对象倾向于在内部保留初始尺寸和坐标系。用这些“意外”值覆盖默认事件属性是个好主意吗?为什么不使用一个特殊的函数来获取这个,而不是使用一个特殊的函数来获取一个人们可能首先期望的函数。。。啊。。。浪费。。。谢谢。对不起,看起来这件事又有一个大转折。使用localToGlobal,您不会将localX转换为“实”值,您只需要获得一个全局坐标,然后可能需要减去偏移量……是的,您需要这样做。我非常肯定有API支持,它可以获得stage.GlobalX或类似的东西。你可能想用这个。嗯。。。起初我的想法是“多么棒的解决方法啊!”,但是。。。它真的解决了问题吗?你会不会在你最右边的像素上得到一个总是200,而不是0.1?。。顺便问一下,改变scaleX和宽度有什么区别?符号“我在做实验的时候,没有发现任何功能上的差异。”@jayarjo。我确实认为它解决了这个问题。你试过了吗?真的不知道为什么设置宽度不起作用。我一直在使用进度条缩放之类的工具,从来没有遇到过重大问题(不是因为我意识到设置宽度有任何问题;只是我学会了这样做,这就是我习惯于思考的方法,嗯,缩放对象)。“…只需捕获显示层次结构上的点击事件。”。。啊。。他们有泡沫吗?我试图在我的自定义活动中添加气泡,但没有成功。或者是默认事件,比如鼠标点击气泡和自定义-不是吗?我认为大约100px的提示和百分比非常棒。但我想只有当一个人缩小那个条时,它才能正常工作,而不是向上,因为否则像素会被“拉伸”,有时会得到太宽的间隔,比如说10%的点。我没有将localX重新计算成百分比,然后再计算成时间,我直接得到时间。是的,大多数输入事件都会在显示列表中冒泡-但是有一些注意事项,因此您可能需要在谷歌上搜索关于AS3事件冒泡的教程。对于另一个评论,我不太明白你的意思,但我所描述的无论剪辑是拉伸还是收缩都是一样的。