2014-05-21 73 views
2

我想知道如果我有一个数组推动是位图的内容,我怎么得到点击时特定图像的索引。我试图使用indexOf但没有运气,我的代码如下。 感谢您的时间!如何从位图数据(从数组)获取位图图像的索引?

代码:

//First Part is where i add the URLRequest and add the image into contentHolder then onto Stage 
function loadImage():void { 
    for(var i:int = 5; i < somedata.length; i++){ 
     if(somedata[i]){ 
      var loader:Loader = new Loader(); 
      loader.load(new URLRequest("http://www.rentaid.info/rent/"+somedata[i])); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded); 

     } 
    } 
} 


function onImageLoaded(e:Event):void { 
    loadedArray.push(e.target.content as Bitmap); 

    for(var i:int = 0; i < loadedArray.length; i++){ 
     var currentY1:int = 200; 

     e.currentTarget.loader.content.height =200; 
     e.currentTarget.loader.content.y += currentY1; 
     currentY1 += e.currentTarget.loader.content.height +300; 
     _contentHolder.mouseChildren = false; // ignore children mouseEvents 
     _contentHolder.mouseEnabled = true;  // enable mouse on the object - normally set to true by default 
     _contentHolder.useHandCursor = true;  // add hand cursor on mouse over 
     _contentHolder.buttonMode = true; 

     _contentHolder.addChild(loadedArray[i]); 
     addChild(_contentHolder); 
     _contentHolder.addEventListener(MouseEvent.CLICK, gotoscene); 
    } 
} 

// then the part where i try to get the index 
function gotoscene(e:MouseEvent):void { 
    var index:Number; 
    index = loadedArray.indexOf(e.target); 
    trace(index); 
} 

编辑:

var viewport:Viewport = new Viewport(); 

    viewport.y = 0; 

    viewport.addChild(_contentHolder); 
+0

你能格式化你的代码?如何调用gotoscene?刺入黑暗中,将e.target改为e.currentTarget。 –

+0

嗨,对不起,我编辑了代码,包括如何在代码中调用gotoscene,当content_Holder被点击时,它是一个mouseEvent。我试过e.currentTarget,没有运气,它显示索引为-1。 – Benyaman

+0

位图不接受鼠标点击,因此您接收到的是一个Sprite(或者甚至可能是一个Loader)。所以你应该得到内容,然后查询你的数组。 – Vesper

回答

2

你的第一个问题很简单的答案:

var image:Bitmap = new Bitmap(); 
var images:Array = new Array(image); 

for (var i:uint = 0; i < images.length; i++) { 
    // images[i].bitmapData is the original image in your array 
    // image.bitmapData is searched one 
    if (images[i].bitmapData == image.bitmapData) { 
     // found 
    } 
} 

但你的问题是比这更大。我看到你继续四处游荡..

你应该为每个孩子添加监听器,而不是内容持有者。我通常不使用Loaders,而是获取他们的Bitmap,并将它们包装在Sprites或其他东西中,我将它们添加到场景中。您应该将此Sprite或您的Loader存储到该数组中,而不是位图。然后将侦听器添加到它们中的每一个(Sprite或Loader,而不是Bitmap)并获取目标。根据您存储在数组中的东西,你可以很容易地得到它为:

function gotoscene(e:MouseEvent):void { 
    var index:uint = loadedArray(indexOf(e.target)); 
} 

但是存储一个特定类型实际上是点击是很重要的。不要考虑位图 - 它只是一个图形表示,并且在代码中没有太多工作。

**编辑: 好吧我加入的代码,你需要而是要了解你在做什么是非常重要的,而不是仅仅依靠别人的答案:)

function onImageLoaded(e:Event):void { 
    var bitmap:Bitmap = e.target.content as Bitmap; // get the Bitmap 

    var image:Sprite = new Sprite(); 
    image.addChild(bitmap); // wrap it inside new Sprite 

    // add listener to Sprite! 
    image.addEventListener(MouseEvent.CLICK, gotoscene); 

    // gets url of current image (http://website.com/images/image1.jpg) 
    var url:String = e.target.loaderURL; 

    // get only the number from that url by replacing or by some other way 
    // this removes the first part and results in "1.jpg" 
    var name:String = url.replace("http://website.com/images/image", ""); 
    // this removes the extension and results in number only - 1, 2, 3 
    // it's important to change this depending on your naming convention 
    name = name.replace(".jpg", ""); 
    image.name = "button" + name; // results in "button1", "button2", "button3" 

    // store object, name, or whatever (not really needed in your case, but commonly used) 
    loadedArray.push(image.name); 

    image.x = counter * 100; // position so you can see them, at 100, 200, 300, etc. 
    _contentHolder.addChild(image); // add newly created Sprite to content 
} 

function gotoscene(e:MouseEvent):void { 
    var name:String = e.target.name; 

    // strips down "button" from "button1", and only the number remains, 
    // which is 1, 2, 3, etc. the number of the scene :) 
    var scene:uint = name.replace("button", ""); 

    // you're the man now :) 
} 
+0

好的代码!我唯一担心的是,比较bitmapData可能会有一些性能问题。如果对于项目来说似乎合理,则可以使用并行/二维数组来为索引“索引”字符串。再说一遍,这里完全可能不适用。只是一个想法。 Upvote都一样。 – CodeMouse92

+1

@ JasonMc92当然你是对的:) LoaderInfo具有loaderURL属性,可以在加载器完成时通过event.target获取。这意味着数组只能存储图像的URL,并且可以稍后进行搜索。问题出在我们想要检查用户点击哪个图像时。当然,还有一个更好的选择 - 将位图封装到Sprite中,并将其保存在数组中,或者保存实例名称。反正有很多选项可以优化,我的代码只是一个示例:) –

+0

Hm ,很好的解决方法。事实上,另一个“至少有10个好方法可以做到这一点”的类型。 – CodeMouse92