Стратегия поддержки международных клавиатур во Flash / Flex - PullRequest
2 голосов
/ 16 июля 2010

У меня есть приложение Flash / Flex, которое показывает странное поведение при использовании в сочетании с международными клавиатурами.Например, я расширил TextInput в этом приложении, чтобы учесть специальное поведение, когда пользователь нажимает клавишу дефиса ('-').Когда это происходит, я хочу, чтобы текст ввода был дополнен нулями в дополнение к набранному тексту до шести цифр.Поэтому, если пользователь вводит «5-», он должен видеть в поле «000005-».

На французской клавиатуре пользователь должен включить CapsLock для ввода цифр, а 6 и дефис разделяют клавишу.Поэтому, когда французские пользователи вводят только «6» с включенным CapsLock, они видят в поле «000006-».Однако, похоже, что 6 и - символы отправляются на поле.Цифра 6 вызывает появление цифры, а - вызывает особое поведение, описанное выше.

Я слышал, что перечисление для TextEvent вместо KeyEvent может помочь в этом случае.Я еще не пробовал, но собираюсь в ближайшее время.Однако есть несколько других проблем, связанных с различиями между международными клавиатурами.Поэтому мне интересно, существуют ли какие-либо общие стратегии для обеспечения правильной поддержки различных международных клавиатур.

Есть мысли или идеи?К вашему сведению, в настоящее время это приложение использует Flex SDK 3.5 и Flash Player 10.

Ответы [ 3 ]

1 голос
/ 20 июля 2010

К вашему сведению, правильным ответом было прослушивание TextEvent, а не KeyboardEvent.Я полагаю, что это имеет смысл, поскольку к тому моменту, когда фактический текст будет доступен, он, вероятно, будет правильно переведен из значений keyCode и charCode.

0 голосов
/ 05 февраля 2013

попробуйте это. Это работает очень хорошо для меня. С помощью этого инструмента и этой таблицы вы локализуете его для своей целевой раскладки клавиатуры

var c:uint;
var symbol:Number = KeyToSymbol(kEvent.keyCode, kEvent.shiftKey, kEvent.altKey);
if (symbol > -1)
  c = SymbolDE(symbol);
else
  c = kEvent.charCode;



function KeyToSymbol(code:Number=-1, shift:Boolean=false, alt:Boolean=false)
{
    var symbol:Number = -1;

    if (shift) {
        switch(code) {
            case 49: symbol = 0; break;
            case 50: symbol = 1; break;
            case 51: symbol = 2; break;
            case 52: symbol = 3; break;
            case 53: symbol = 4; break;
            case 54: symbol = 5; break;
            case 55: symbol = 6; break;
            case 56: symbol = 8; break;
            case 57: symbol = 10; break;
            case 48: symbol = 12; break;
            case 219: symbol = 14; break;
            case 221: symbol = 17; break;
            case 187: symbol = 19; break;
            case 191: symbol = 22; break;
            case 189: symbol = 25; break;
            case 190: symbol = 27; break;
            case 188: symbol = 29; break;
            case 222: symbol = 31; break;
            case 192: symbol = 33; break;
            case 186: symbol = 35; break;
            case 226: symbol = 38; break;
            case 220: symbol = 41; break;
        }
    }else if (alt) {
        switch(code) {
            case 55: symbol = 7; break;
            case 56: symbol = 9; break;
            case 57: symbol = 11; break;
            case 48: symbol = 13; break;
            case 219: symbol = 16; break;
            case 187: symbol = 21; break;
            case 81: symbol = 36; break;
            case 226: symbol = 39; break;
            case 69: symbol = 42; break;
        }
    }else {
        switch(code) {
            case 219: symbol = 14; break;
            case 187: symbol = 20; break;
            case 191: symbol = 23; break;
            case 189: symbol = 24; break;
            case 190: symbol = 26; break;
            case 188: symbol = 28; break;
            case 222: symbol = 30; break;
            case 192: symbol = 32; break;
            case 186: symbol = 34; break;
            case 226: symbol = 37; break;
            case 220: symbol = 40; break;
        }
    }
    return symbol;
}


function SymbolDE (symbol:Number = -1) {
    switch(symbol) {
        case 0: return 33; break;   // ! 
        case 1: return 34; break;   // " 
        case 2: return 167; break;  // § 
        case 3: return 36; break;   // $ 
        case 4: return 37; break;   // % 
        case 5: return 38; break;   // & 
        case 6: return 47; break;   // /  
        case 7: return 123; break;  // {  
        case 8: return 40; break;   // (  
        case 9: return 91; break;   // [ 
        case 10: return 41; break;  // )  
        case 11: return 93; break;  // ] 
        case 12: return 61; break;  // = 
        case 13: return 125; break;     // } 
        case 14: return 63; break;  // ?
        case 15: return 223; break; // ß
        case 16: return 92; break;  /* \ */
        case 17: return 96; break;  // ´
        case 19: return 42; break;  // *
        case 20: return 43; break;  // +
        case 21: return 126; break; // ~
        case 22: return 39; break;  // '
        case 23: return 35; break;  // #
        case 24: return 45; break;  // -
        case 25: return 95; break;  // _
        case 26: return 46; break;  // .
        case 27: return 58; break;  // :
        case 28: return 44; break;  // ,
        case 29: return 59; break;  // ;
        case 30: return 228; break; // ä
        case 31: return 196; break; // Ä
        case 32: return 246; break; // ö
        case 33: return 214; break; // Ö
        case 34: return 252; break; // ü
        case 35: return 220; break; // Ü
        case 36: return 64; break;  // @
        case 37: return 60; break;  // <
        case 38: return 62; break;  // >
        case 39: return 124; break; // |
        case 40: return 94; break;  // ^
        case 41: return 186; break; // °
        case 42: return 128; break; // €
    }
}
0 голосов
/ 18 июля 2010

Вы когда-нибудь пробовали клавиатурыEvent.charCode с String.fromCharcode?

private function onKeyDown(e:KeyboardEvent):void {
    var c:String = String.fromCharCode(e.charCode);
    switch (c) {
    case '-': ....
    }
}

Управление текстами в обработчике событий TextEvent.TEXT_INPUT будет в порядке, но я не рекомендую этот подход, потому что время, когда TextEventОтправленный .TEXT_INPUT имеет небольшую разницу в FP10 и FP10.1 (для 10.1 новый API для IME справился с этим событием)

Для более подробной информации я сделал ограниченную реализацию:

Обработка TextFieldсвязанные события - чудо-флеш-сборка онлайн
...