2012-09-17 35 views
1

想象一下繪畫程序。我有兩個相互重疊的圖像。如果點擊上面的透明部分,我必須能夠點擊後面的圖像。如何設置鼠標點擊以不打透明像素

我在每個圖像上添加一個事件監聽器。所以我必須阻止第一個派遣點擊事件以便後面的派遣它。

(我的意思是,我已經檢查透明的像素,但我不能取消事件的其他IMAGEM調度它。)

+0

也許使用地圖區域而不是img,就像谷歌地圖的作品。 – andres83

+0

用圖像掩蓋圖像 –

回答

1

有一些骯髒的解決方案。假設您的「圖像」封裝在Sprites中,否則您無法將偵聽器附加到Bitmap對象或Shape對象。影片剪輯 - 嗯,應該仍然有效,雖然檢查alpha會更困難。你有聽衆附在這些精靈身上。首先,精靈本身可以檢查透明度,如果不透明,則繼續事件。要獲得後面的內容,可以調用stage.getObjectsUnderPoint(),這將返回一個DisplayObject對象,其前景位於頂部。所以你可能有一個單獨的監聽器會調用它來枚舉什麼是重點,然後按照Roman Trofimov的建議來確定該對象的透明度。一旦你會發現一個非透明物體,你這樣做:

// "b" is a non-transparent DisplayObject found beforehand 
while (b && (!(b is InteractiveObject))) b = b.parent; 
if (b) { 
    var p:Point = new Point(e.stageX, e.stageY); 
    p = b.globalToLocal(p); 
    b.dispatchEvent(new MouseEvent('click', true, true, p.x, p.y)); 
} 

這將派遣一個click事件這是可以接受的事件,並且足夠不透明掩蓋背景和目標。

+0

我會認爲這個答案是對我個案的最好解答,因爲它對我有所幫助。 – Fabricio

0

的影片剪輯屬性「將mouseEnabled」可以防止在對象上觸發點擊事件其他對象的前面,例如,採取相同尺寸和位置的兩個影片剪輯:

mc1.addEventListener(MouseEvent.CLICK, click1); 
function click1(e:MouseEvent) : void 
{ 
    trace("1"); 
} 

mc2.addEventListener(MouseEvent.CLICK, click2); 
function click2(e:MouseEvent) : void 
{ 
    trace("2"); 
} 

mc1.mouseEnabled = false; 

輸出將是「2」的點擊將基本上去「到」 MC1。

0

在flex中,您可以向組件添加mouseEnabledWhereTransparent =「false」。不完全確定這個變量是否可用,但

+0

我正在使用s:圖像組件 – Fabricio

0

通常,您將始終從第一個精靈獲得第一個事件(如果它不是捕獲階段的優先級更改)。但據我所知,你需要檢查是否透明,如果不是 - 停止冒泡這個事件。

要停止事件 - 在事件處理程序中使用event.stopImmediatePropagation()

要確定透明度:

1)如果是僅僅只有一個位圖,你可以檢查其.bitmapData與方法.getPixel32,它會返回alpha值。

2)如果結合的精靈(矢量和位圖),則需要手動使其使用BitmapData.draw爲位圖,然後使用溶液從第二殼體

3)要理解,如果它是absolutelly錯過單擊,則可以嘗試這種方法:Check transparency

相關問題