Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AdobeAIR上下文菜单-右键单击并展开_Actionscript 3_Flash_Air - Fatal编程技术网

Actionscript 3 AdobeAIR上下文菜单-右键单击并展开

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

我正在将一个基于web的actionscript项目转换为AIR。actionscript的web版和air版在处理上下文菜单的方式上似乎存在一些细微的差异,而我正在转换的(相当大的)代码库依赖于处理上下文菜单的这些细微之处之一

为了这个问题的目的,让我们采用一个非常简单的空气应用:

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中为我工作-假设我在菜单关闭后移动鼠标,然后再次右键单击。