displacementMapfilter浮动在它下面的对象

时间:2013-05-20 22:21:56

标签: actionscript-3 actionscript filter magnification

我一直在使用类似于Adobe的标准displaMapfilter和许多其他示例创建一个放大镜类:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7da2.html

过滤器正在应用程序级别使用,因此它会过滤所有内容,并且可以在屏幕上拖动,旋转和缩放大量图像元素,并且当在此过滤器下方传递时,它会放大它们。我还打算添加一些功能以允许拖动过滤器。

过滤器按预期工作,放大通过它的所有内容。奇怪的是,无论何时将图像拖到屏幕的顶部或左边缘之外,过滤器都会沿着该方向浮动图像完全在屏幕之前所需的距离(即:如果图像500,过滤器会浮动500像素)像素宽被拉到屏幕左侧。)

我正在使用一个enterFrame监听器来不断更新其位置,它的工作原理如下:

private function onEnterFrame(e:Event):void {

    dPoint.x = stage.stageWidth - radius;
    dPoint.y = stage.stageHeight - radius;

    dFilter = new DisplacementMapFilter(map, dPoint, BitmapDataChannel.RED, BitmapDataChannel.BLUE, 100, 100, DisplacementMapFilterMode.IGNORE, 0x000000, 0);

    // The application is a displayObject itself, so just apply filters to "this"
    this.filters = [dFilter];
}

所以这段代码应该将滤镜锚定在屏幕的右下方,但是无论何时拖动图像,滤镜都会随之漂移。过滤器会有什么理由这样做,我能以任何方式阻止它吗?

1 个答案:

答案 0 :(得分:0)

将图像拖离舞台会更改应用滤镜的矩形的大小和形状(将滤镜描绘为拍摄舞台上所有内容的快照)。当图像从左上角移开时,意味着滤镜上的(0,0)实际上位于图像的左上角。

如果您检查舞台的边界(在舞台自己的坐标空间中),当您拖动图像时,您会看到topleft变为负数:

stage.getBounds(stage).top;
stage.getBounds(stage).left;

取消任何负面界限应使过滤器保持在正确的位置:

var stageBounds:Rectangle = stage.getBounds(stage);
if (stageBounds.left < 0) {
    dPoint.x -= stageBounds.left;
}
if (stageBounds.top < 0) {
    dPoint.y -= stageBounds.top;
}