2012-03-14 75 views
3

作爲此處的另一個問題的跟進: 我在Flash應用程序中構建了一個自定義的contextmenu項目,並且它有時會出現問題而無法顯示。 我發現問題在於另一個精靈在自定義上下文菜單的「項目頂部」。然而,即使「mouseEnabled」和「mouseChildren」屬性設置爲false爲項目「頂部」我仍然無法獲得自定義contextmenu顯示... 任何想法?謝謝!自定義ContextMenu未顯示,因爲顯示對象位於「頂部」

PS:這裏是一些代碼,看問題:

var spr:Sprite=new Sprite(); 
spr.graphics.beginFill(0xff0000,1); 
spr.graphics.drawRect(0,0,100,100); 
addChild(spr); 

var blocker:Sprite=new Sprite(); 
blocker.x=50 
blocker.y=50 
blocker.graphics.beginFill(0x00ff00,1); 
blocker.graphics.drawRect(0,0,100,100); 
addChild(blocker); 
blocker.mouseEnabled=false 
blocker.mouseChildren=false 

var customContextMenu:ContextMenu = new ContextMenu(); 
var item:ContextMenuItem = new ContextMenuItem("custom item"); 
customContextMenu.customItems.push(item); 
item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemSelectHandler,false,0,true); 
spr.contextMenu = customContextMenu; 

function menuItemSelectHandler(cem:ContextMenuEvent) { 
    trace("hello context"); 
}; 

當鼠標移動到綠色矩形,自定義的ContextMenuItem沒有顯示

+0

1)一些代碼將永遠有幫助。 2)你在同一圖層中有精靈和上下文菜單嗎? 3)您是否嘗試將contextMenu的childIndex設置爲子列表中的最高值? – 2012-03-14 12:33:32

+0

嗨,好讓它更清楚一點: 自定義的contextmenu不是一個精靈,而是一個正常的上下文菜單中的項目。 我給原帖增加了一些代碼 – zantafio 2012-03-14 16:06:17

回答

1

爲對象的上下文菜單將顯示只要用戶右鍵單擊該對象本身,就我所知。

我已經簡化您的問題在此代碼:

public class Test extends Sprite 
{ 
    public function Test() 
    { 
     stage.align = StageAlign.TOP_LEFT; 
     stage.scaleMode = StageScaleMode.NO_SCALE; 

     var sprite:Sprite = new Sprite(); 
     addChild(sprite); 

     sprite.graphics.beginFill(0xFF0000); 
     sprite.graphics.drawRect(0, 0, 200, 200); 
     sprite.graphics.endFill(); 

     var shape:Shape = new Shape(); 
     addChild(shape); 

     shape.graphics.beginFill(0x0000FF, .6); 
     shape.graphics.drawRect(100, 100, 200, 200); 
     shape.graphics.endFill(); 

     setUpContextMenu(sprite); 
    } 

    private function setUpContextMenu(target:InteractiveObject):void 
    { 
     var menu:ContextMenu = new ContextMenu(); 
     target.contextMenu = menu; 

     var item:ContextMenuItem = new ContextMenuItem("About Us"); 
     menu.customItems.push(item); 
    } 
} 

當您在其中紅色和藍色正方形重疊區域單擊右鍵,你沒有得到的自定義上下文菜單。

這裏有一個可能的解決方案,在那裏我已經修改只有setUpContextMenu()功能:

private function setUpContextMenu(target:InteractiveObject):void 
    { 
     var menu:ContextMenu = new ContextMenu(); 
     this.contextMenu = menu; 

     var item:ContextMenuItem = new ContextMenuItem("About Us"); 

     var handler:Function = function (event:ContextMenuEvent):void { 
      // Start with empty menu. 
      var items:Array = []; 

      if (event.mouseTarget == target) { 
       // Directly right-clicked on target. Add custom item. 
       items = [item]; 

      } else if (event.mouseTarget is DisplayObjectContainer) { 
       var o:DisplayObjectContainer 
        = DisplayObjectContainer(event.mouseTarget); 
       var pt:Point = o.localToGlobal(new Point(o.mouseX, o.mouseY)); 
       var arr:Array = o.getObjectsUnderPoint(pt); 

       // One of the mouse target's descendants is our target, 
       // directly under the pointer. Add custom item. 
       if (arr.indexOf(target) != -1) 
        items = [item]; 
      } 

      menu.customItems = items; 
     }; 

     menu.addEventListener(ContextMenuEvent.MENU_SELECT, handler); 
    } 

這裏我指定的上下文菜單到應用程序本身。在"menuSelect"事件中,我根據鼠標指針是否位於紅色方塊上方進行了自定義。

+0

謝謝mate!這有幫助。 – zantafio 2012-03-28 09:43:25