在AS3中获得鼠标单击颜色的最佳方法

时间:2020-03-05 18:57:37  来源:igfitidea点击:

我有一张图片(mx),我想获取被单击像素的单位。

有任何想法吗?

解决方案

回答

在BitmapData LiveDoc页面上几分钟,将带我们到需要的地方。将图像加载到Bitmap变量后,就可以访问其BitmapData属性。将鼠标单击事件侦听器添加到图像,然后使用BitmapData :: getPixel。 getPixel的示例显示了如何将uint响应转换为rgb十六进制代码。

这是对BitmapData页面上给出的Example的修改,该示例对我有用(使用mxmlc YMMV):

package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;

    public class BitmapDataExample extends Sprite {
        private var url:String = "santa-drunk1.jpg";
        private var size:uint = 200;
        private var image:Bitmap;

        public function BitmapDataExample() {
            configureAssets();
        }

        private function configureAssets():void {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

            var request:URLRequest = new URLRequest(url);
            loader.load(request);
            addChild(loader);
        }

        private function completeHandler(event:Event):void {
            var loader:Loader = Loader(event.target.loader);
            this.image = Bitmap(loader.content);

            this.addEventListener(MouseEvent.CLICK, this.clickListener);
        }

        private function clickListener(event:MouseEvent):void {
            var pixelValue:uint = this.image.bitmapData.getPixel(event.localX, event.localY)
            trace(pixelValue.toString(16));
        }
    }
}

回答

这是一个更简单的实现。我们要做的就是使用bitmapData的draw()方法为舞台拍摄快照,然后在鼠标下方的像素上使用getPixel()。这样做的好处是我们可以采样绘制到舞台上的所有内容,而不仅仅是给定的位图。

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;

stage.addEventListener(MouseEvent.CLICK, getColorSample);

function getColorSample(e:MouseEvent):void {
    var bd:BitmapData = new BitmapData(stage.width, stage.height);
    bd.draw(stage);
    var b:Bitmap = new Bitmap(bd);
    trace(b.bitmapData.getPixel(stage.mouseX,stage.mouseX));
}

希望这会有所帮助!

编辑:

这个编辑的版本只使用了一个" BitmapData",并省去了创建" Bitmap"的不必要步骤。如果要在" MOUSE_MOVE"上对颜色进行采样,那么这对于避免内存问题至关重要。

注意:如果我们使用的是自定义游标精灵,则必须使用'state'以外的其他对象,否则我们将采样自定义精灵的颜色,而不是其下方的颜色。

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;

private var _stageBitmap:BitmapData;

stage.addEventListener(MouseEvent.CLICK, getColorSample);

function getColorSample(e:MouseEvent):void 
{
    if (_stageBitmap == null) {
        _stageBitmap = new BitmapData(stage.width, stage.height);
    }
    _stageBitmap.draw(stage);

    var rgb:uint = _stageBitmap.getPixel(stage.mouseX,stage.mouseY);

    var red:int =  (rgb >> 16 & 0xff);
    var green:int =  (rgb >> 8 & 0xff);
    var blue:int =  (rgb & 0xff);

    trace(red + "," + green + "," + blue);
}