flex 自定义右键菜单实现

时间:2016-4-27    作者:悬浮的青春    分类: gis二次开发


flex自带一个flash官方的右键菜单。特别难看。因此会有屏蔽该菜单,新增一个自定义菜单的需求。


首先。

项目中新增注册类 RightClickManager,代码如下:
package com.siloon.plugin.rightClick
{
     import flash.display.DisplayObject;
     import flash.display.InteractiveObject;
     import flash.events.ContextMenuEvent;
     import flash.events.MouseEvent;
     import flash.external.ExternalInterface;
    
     import mx.core.Application;
    
     public class RightClickManager
     {
          static private var rightClickTarget:DisplayObject;
        static public const RIGHT_CLICK:String = "rightClick";
        static private const javascript:XML =
        <script>
             <![CDATA[
                  /**
                    *
                    * Copyright 2007
                    *
                    * Paulius Uza
                    * http://www.uza.lt
                    *
                    * Dan Florio
                    * http://www.polygeek.com
                    *
                    * Project website:
                    * http://code.google.com/p/custom-context-menu/
                    *
                    * --
                    * RightClick for Flash Player.
                    * Version 0.6.2
                    *
                    */
                    function(flashObjectId)
                    {                   
                         var RightClick = {
                              /**
                              *  Constructor
                              */
                              init: function (flashObjectId) {
                                   this.FlashObjectID = flashObjectId;
                                   this.Cache = this.FlashObjectID;
                                   if(window.addEventListener){
                                        window.addEventListener("mousedown", this.onGeckoMouse(), true);
                                   } else {
                                        document.getElementById(this.FlashObjectID).parentNode.onmouseup = function() { document.getElementById(RightClick.FlashObjectID).parentNode.releaseCapture(); }
                                        document.oncontextmenu = function(){ if(window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; }}
                                        document.getElementById(this.FlashObjectID).parentNode.onmousedown = RightClick.onIEMouse;
                                   }
                              },
                              /**
                              * GECKO / WEBKIT event overkill
                              * @param {Object} eventObject
                              */
                              killEvents: function(eventObject) {
                                   if(eventObject) {
                                        if (eventObject.stopPropagation) eventObject.stopPropagation();
                                        if (eventObject.preventDefault) eventObject.preventDefault();
                                        if (eventObject.preventCapture) eventObject.preventCapture();
                                           if (eventObject.preventBubble) eventObject.preventBubble();
                                   }
                              },
                              /**
                              * GECKO / WEBKIT call right click
                              * @param {Object} ev
                              */
                              onGeckoMouse: function(ev) {
                                     return function(ev) {
                                  if (ev.button != 0) {
                                        RightClick.killEvents(ev);
                                        if(ev.target.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
                                            RightClick.call();
                                        }
                                        RightClick.Cache = ev.target.id;
                                   }
                                }
                              },
                              /**
                              * IE call right click
                              * @param {Object} ev
                              */
                              onIEMouse: function() {
                                     if (event.button > 1) {
                                        if(window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
                                             RightClick.call();
                                        }
                                        document.getElementById(RightClick.FlashObjectID).parentNode.setCapture();
                                        if(window.event.srcElement.id)
                                        RightClick.Cache = window.event.srcElement.id;
                                   }
                              },
                              /**
                              * Main call to Flash External Interface
                              */
                              call: function() {
                                   document.getElementById(this.FlashObjectID).rightClick();
                              }
                         }
                        
                         RightClick.init(flashObjectId);
                    }
             ]]>
        </script>;

        public function RightClickManager()
        {
            return;
        }

        static public function regist() : Boolean
        {
            if (ExternalInterface.available)
            {
                ExternalInterface.call(javascript, ExternalInterface.objectID);
                ExternalInterface.addCallback("rightClick", dispatchRightClickEvent);
                Application.application.addEventListener(MouseEvent.MOUSE_OVER,mouseOverHandler);
            }// end if
            return true;
        }

        static private function mouseOverHandler(event:MouseEvent) : void
        {
               //rightClickTarget = DisplayObject(event.target);
               rightClickTarget = InteractiveObject(event.target);
            return;
        }

        static private function dispatchRightClickEvent() : void
        {
               var event:MouseEvent;
            if (rightClickTarget != null)
            {
                event = new MouseEvent(RIGHT_CLICK, true, false, rightClickTarget.mouseX, rightClickTarget.mouseY);
                    //event = new ContextMenuEvent(RIGHT_CLICK, true, false, rightClickTarget as InteractiveObject, rightClickTarget as InteractiveObject);
                    rightClickTarget.dispatchEvent(event);
            }// end if
            return;
        }

     }
}


然后。

打开自己的Flex工程下的html-template文件夹下的index.template.html文件(右击-Open With-Text Editor),在var params = {};语句的下面添加下面的语句:
params.wmode = "opaque";//屏蔽系统右键菜单的关键



最后初始化的方法中。

var rightClickRegisted:Boolean=false;


某初始化方法


if (!rightClickRegisted) 

RightClickManager.regist(); 
rightClickRegisted = true; 
}
this.addEventListener(RightClickManager.RIGHT_CLICK,rightClickHandler);


//控件右击事件

private function rightClickHandler(event:MouseEvent):void

{
//tree_onRightClicked(event);
if(!event.currentTarget.treeEvent.selectedItem.hasOwnProperty("children"))
{
removeMenu();
initMenu();
}
else
{
return;
}
}

//创建菜单项
private function createMenuItems():Array 


var menuItems:Array = new Array();



var menuItem:Object;

menuItem = new Object; 

menuItem.label = '编辑半径'; //菜单项名称

//menuItem.itemIcon = this.menu_SX;//菜单项图标

menuItems.push(menuItem);

return menuItems; 

}

//生成右键菜单
var menu:Menu=new Menu();
private function initMenu():void
{

menu = Menu.createMenu(this, createMenuItems(), false);

//menu.iconField="itemIcon";//右键菜单的图标

//menu.labelField="label";  //右键菜单的名称

menu.variableRowHeight = true;    
menu.width=100;

menu.addEventListener(MenuEvent.ITEM_CLICK, menuItemSelected);  //右键菜单的事件

var point:Point = new Point(mouseX,mouseY); 

point = localToGlobal(point);  

menu.show(point.x,point.y);  //显示右键菜单

}

//删除右键菜单

private function removeMenu():void


if(menu!=null) 

menu.hide();

menu.removeEventListener(MenuEvent.ITEM_CLICK,menuItemSelected); 

menu=null; 


}



//菜单项点击事件

private function menuItemSelected(event:MenuEvent):void
{
var menuItem:Object = event.menu.selectedItem as Object;
//……
switch(menuItem.label)
{
case "编辑半径":
//addLine();
EditRadius();
break;
//                         ……
}
}



标签: flex

WRITTEN BY

avatar