想象一下繪畫程序。我有兩個相互重疊的圖像。如果點擊上面的透明部分,我必須能夠點擊後面的圖像。如何設置鼠標點擊以不打透明像素
我在每個圖像上添加一個事件監聽器。所以我必須阻止第一個派遣點擊事件以便後面的派遣它。
(我的意思是,我已經檢查透明的像素,但我不能取消事件的其他IMAGEM調度它。)
想象一下繪畫程序。我有兩個相互重疊的圖像。如果點擊上面的透明部分,我必須能夠點擊後面的圖像。如何設置鼠標點擊以不打透明像素
我在每個圖像上添加一個事件監聽器。所以我必須阻止第一個派遣點擊事件以便後面的派遣它。
(我的意思是,我已經檢查透明的像素,但我不能取消事件的其他IMAGEM調度它。)
有一些骯髒的解決方案。假設您的「圖像」封裝在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事件這是可以接受的事件,並且足夠不透明掩蓋背景和目標。
我會認爲這個答案是對我個案的最好解答,因爲它對我有所幫助。 – Fabricio
的影片剪輯屬性「將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。
通常,您將始終從第一個精靈獲得第一個事件(如果它不是捕獲階段的優先級更改)。但據我所知,你需要檢查是否透明,如果不是 - 停止冒泡這個事件。
要停止事件 - 在事件處理程序中使用event.stopImmediatePropagation()
。
要確定透明度:
1)如果是僅僅只有一個位圖,你可以檢查其.bitmapData
與方法.getPixel32
,它會返回alpha值。
2)如果結合的精靈(矢量和位圖),則需要手動使其使用BitmapData.draw
爲位圖,然後使用溶液從第二殼體
3)要理解,如果它是absolutelly錯過單擊,則可以嘗試這種方法:Check transparency
也許使用地圖區域而不是img,就像谷歌地圖的作品。 – andres83
用圖像掩蓋圖像 –