Flex自定义右键菜单具体实现_Flex教程-查字典教程网
Flex自定义右键菜单具体实现
Flex自定义右键菜单具体实现
发布时间:2016-12-29 来源:查字典编辑
摘要:1.自定义右键菜单注册类:项目中新增注册类RightClickManager,代码如下:复制代码代码如下:packagecom.siloon...

1.自定义右键菜单注册类:

项目中新增注册类 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;

}

}

}

2. 打开自己的Flex工程下的html-template文件夹下的index.template.html文件(右击-Open With-Text Editor),在var params = {};语句的下面添加下面的语句:

params.wmode = "opaque";//屏蔽系统右键菜单的关键

--------------------------------------------------------------------------------

3. 在主程序文件中引入:

复制代码 代码如下:

//初始化

protected function init():void

{

if (!rightClickRegisted)

{

maxNumText.text=rightClickRegisted.toString();

RightClickManager.regist();

rightClickRegisted = true;

}

this.addEventListener(RightClickManager.RIGHT_CLICK,rightClickHandler);

maxNumText.text+="init";

}

//创建菜单项

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;

}

//生成右键菜单

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); //显示右键菜单

maxNumText.text="initMenu";

}

//删除右键菜单

private function removeMenu():void

{

if(menu!=null)

{

menu.hide();

menu.removeEventListener(MenuEvent.ITEM_CLICK,menuItemSelected);

menu=null;

}

maxNumText.text="removeMenu";

}

//菜单项点击事件

private function menuItemSelected(event:MenuEvent):void

{

var menuItem:Object = event.menu.selectedItem as Object;

//……

switch(menuItem.label)

{

case "刷新":

addLine();

break;

// ……

}

}

private function addLine():void

{

maxNumText.text="addLine";

}

//控件右击事件

private function rightClickHandler(event:MouseEvent):void

{

//tree_onRightClicked(event);

maxNumText.text="rightClickHandler0";

removeMenu();

initMenu();

maxNumText.text="rightClickHandler";

}

4.完整代码如下:

示例代码文件

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Flex学习
    热门Flex学习
    编程开发子分类