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