【问题标题】:Keyboard code mapping in Adobe Flash/Flex for the browser用于浏览器的 Adob​​e Flash/Flex 中的键盘代码映射
【发布时间】:2009-06-18 19:44:28
【问题描述】:

注意请记住 key 代码和 character 代码之间的区别。例如,数字 1(一)和字符 ! (bang) 两者都有相同的 key 代码但不同的 character 代码。同样,数字行中的数字 7 和小键盘中的数字 7 具有不同的 key 代码,但具有相同的 字符 代码。

我正在用 Adob​​e Flex 编写一个音乐节奏游戏,并且想绑定键盘按键。这不是问题,但我肯定会遇到问题,例如,将默认键设置为 A、S、D 和 F 并告诉用户是这种情况。

如果您查看flash.ui.Keyboard 的文档,您会发现键盘键与键码之间存在常量。但是,这些仅在 Adob​​e AIR 中可用,在浏览器中不可用。这是有道理的,因为并非所有操作系统和键盘都相同(或存在!),因此键码可能会有所不同。

那么,我怎样才能分配有意义的默认键而不是选择键码和祈祷呢?

我唯一理智的想法是存储键绑定的字符代码,然后提供一个字符代码到字符串映射,这样我就可以告诉用户要按什么。 但是,我的直觉告诉我,这会以微妙或不那么微妙的方式破坏。就像 CAPSLOCK。

谢谢。

更新:我目前正在使用radekg's 答案,但我仍然认为这很容易中断。如果有人认为这是正确的,我会觉得更舒服。

【问题讨论】:

    标签: apache-flex flash browser user-interface keyboard


    【解决方案1】:

    根据 Flash 8 文档,您可以简单地依赖 ASCII 代码。查看 Flash 8 文档的这些主题:

    据我所知,所有现代操作系统都使用标准 ASCII。这些代码自 Flash 5 时代以来没有改变。如果您不想依赖 ASCII 码来比较字母:

    private function compareChar(code:Number):void {
        if ( "a" == String.fromCharCode( code ).toLowerCase() ) {
            trace("A pressed");
        } else {
            trace("You pressed " + String.fromCharCode(code));
        }
    }
    ...
    compareChar(65); // 65 is A
    compareChar(96); // 96 is numpad 0
    

    但是我认为您可以依赖 ASCII 代码。 希望这会有所帮助。

    【讨论】:

    • 我认为您的 event.keyCode 应该是代码。我不小心找到了 String 全局函数文档而不是 String 类文档,因此错过了 fromCharCode。另外,我没想到要使用 toLowerCase(),所以谢谢。
    • 感谢您指出这些错误,已修复。关于 fromCharCode - 这是文档的 URL(如果有人想快速查看):livedocs.adobe.com/flex/3/langref/String.html#fromCharCode()。 toLowerCase() 是必需的,因为 String.fromCharCode(65) 返回“A”而不是“a”。当然条件可以改为: if ("A" == String.fromCharCode( code ) ) ...
    【解决方案2】:

    Radekg 基本正确。

    Flash 有一个内置的 Flash.ui.KeyLocation 类,它具有四个静态属性:LEFT、RIGHT、NUM_PAD、STANDARD。这意味着即使键盘已重新映射,您也可以确定按下了哪个键。如果你把它与String.fromCharCode结合起来,你应该可以相当巧妙地解决这个问题。

    您的最终代码可能如下所示:

    import flash.ui.KeyLocation;
    import flash.events.KeyboardEvent;
    
    function handleKeyboardEvent( event:KeyboardEvent )
    {
        // This will work for a majority of the keys.
        var key:String = String.fromCharCode( event.charCode ).toLowerCase();
    
        // Use strict comparison
        if( event.keyLocation !== KeyLocation.STANDARD )
        {
            // The key is a number, then it needs to be re-identified.
            if( event.keyLocation == KeyLocation.RIGHT  )    key = "r" + key;
            if( event.keyLocation == KeyLocation.LEFT   )      key = "l" + key;
            if( event.keyLocation == KeyLocation.NUM_PAD)   key = "n" + key;
        }
    
        switch( key )
        {
            case "r1":
                // Do something with the one which is not on the keypad.
                break;
            case "n.":
                // Do something with the number pad's period.
                break;
            case "n":
                // Do something with the letter N.
                break;
        }
    }
    

    我承认,我不确定 String.fromCharCode 和控制键(F1、Alt、Ctrl 等)会发生什么,但 KeyboardEvent 确实支持 event.shiftKey、event.ctrlKey、event.altKey

    【讨论】:

    • KeyLocation 非常有创意的答案!我想我只能接受没有“漂亮”的方法可以做到这一点。因为我的目标是浏览器,所以 Flash 没有获得功能键的焦点(很遗憾,如果有它们就好了)。
    • 你试过ExternalEvironment.call("setFocus("+Application.application.id+");")吗? (如果我的语法有点不对,请原谅我)。它远非完美,但它允许您强制浏览器将焦点设置在 swf 及其子组件上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多