Actionscript 3 AdobeAIR上下文菜单-右键单击并展开
我正在将一个基于web的actionscript项目转换为AIR。actionscript的web版和air版在处理上下文菜单的方式上似乎存在一些细微的差异,而我正在转换的(相当大的)代码库依赖于处理上下文菜单的这些细微之处之一 为了这个问题的目的,让我们采用一个非常简单的空气应用:Actionscript 3 AdobeAIR上下文菜单-右键单击并展开,actionscript-3,flash,air,Actionscript 3,Flash,Air,我正在将一个基于web的actionscript项目转换为AIR。actionscript的web版和air版在处理上下文菜单的方式上似乎存在一些细微的差异,而我正在转换的(相当大的)代码库依赖于处理上下文菜单的这些细微之处之一 为了这个问题的目的,让我们采用一个非常简单的空气应用: package { import flash.display.NativeMenu; import flash.display.NativeMenuItem; import flash.di
package
{
import flash.display.NativeMenu;
import flash.display.NativeMenuItem;
import flash.display.Sprite;
import flash.events.MouseEvent;
public class test extends Sprite
{
private var menu:NativeMenu;
private var menuItem:NativeMenuItem;
public function test()
{
menu = new NativeMenu();
menuItem = new NativeMenuItem("Menu Item");
menu.addItem(menuItem);
var s:Sprite = new Sprite();
s.graphics.clear();
s.graphics.beginFill(0x65ffff, 1);
s.graphics.drawRect(0,0, 100, 100);
s.graphics.endFill();
s.x = 10;
s.y = 10;
this.addChild(s);
s.addEventListener(MouseEvent.RIGHT_CLICK, rightClick);
s.addEventListener(MouseEvent.ROLL_OUT, rollOut);
s.addEventListener(MouseEvent.ROLL_OVER, rollOver);
}
private function rightClick(event:MouseEvent):void {
trace("right click");
menu.display(stage, event.stageX, event.stageY);
}
private function rollOut(event:MouseEvent):void {
trace("roll out");
}
private function rollOver(event:MouseEvent):void {
trace("roll over");
}
}
}
假设我运行这个应用程序,右键点击蓝色精灵四次。我希望在每次显示关联菜单之前和之后都能收到回滚和回滚事件。相反,我在调试器日志中收到以下输出:
roll over
right click
roll out
right click
right click
roll over
roll out
right click
第一次单击按预期工作。但接下来的两次单击既不会生成翻滚,也不会生成翻滚。更奇怪的是,第四次点击会产生翻滚,然后是翻滚,然后是右键点击
这是一个问题的原因,因为我正在转换的旧式代码(同样是为基于web的actionscript编写的)依赖于此回滚和回滚行为来更改将显示的上下文菜单项。它在基于web的版本中工作,因为每次用户右键单击时都会以相同的顺序触发这些事件:滚动、右键单击、滚动。但正如我们在这里看到的,空气的情况并非如此
我意识到解决这一问题的一种方法是改变应用程序的工作方式,以便它根据需要为不同的精灵分配不同的上下文菜单,但我正在寻找一种方法来保持与传统系统相同的方法,以尽量减少我需要做的更改数量
因此,我的问题是:是否有一种方法可以让AIR在每次用户右键单击精灵时,在显示菜单之前和之后,以相同的顺序一致地生成翻滚和翻滚事件?要清楚,当您右键单击时,即使鼠标在两次单击之间没有离开对象的边界,您也希望滚动事件被分派吗?@Batman:是的,所有右键单击都发生在同一对象的边界内。要分派这些事件,鼠标必须移动。当菜单出现时,它获取焦点(将在正方形上调度卷展栏)。当您关闭菜单时,焦点应返回到应用程序,但在鼠标移动之前,您不会获得翻滚事件。(因此,如果你右键单击而不移动鼠标,它将显示你所显示的行为)@蝙蝠侠:我不确定你的意思是什么,但我做的测试肯定涉及鼠标移动,但所有鼠标移动都发生在同一对象/精灵的范围内。显示关联菜单后,右键单击通常不会将焦点返回到单击的对象。我尝试了您的示例,在AIR 15中为我工作-假设我在菜单关闭后移动鼠标,然后再次右键单击。