Marmalade SDKСтатьи

Tutorial 4. Marmalade SDK Handling key inputs and the on screen keyboard

Автор:

Tutorial 4. Marmalade SDK Handling key inputs and the on screen keyboard


Android_Icon_170x170_0 | Tutorial 4. Marmalade SDK  Handling key inputs and the on screen keyboard

В сегодняшнем туториале мы рассмотрим клавишный ввод и экранную клавиатуру.
Как обычно, если Вам нужен исходный код по этой статье, тогда вы можете Скачать его здесь.
Если Вам нужны подробности по обновлённому классу CInput, тогда читайте дальше, пожалуйста.

Keys and Key States

Marmalade отображает клавиши устройства в виде перечня, который называется s3eKey. Если Вы посмотрите на файл заголовка Marmalade SDK s3eKeyboard.h, Вы увидите, что список отображаемых клавиш довольно обширен.
Marmalade использует положения клавиш, чтобы мы знали, что в данный момент происходит со всеми доступными клавишами на устройстве, например, мы делаем запрос такой как «нажата ли задняя клавиша» или «клавиша меню вверх или вниз». Поддерживаются следующие положения:
•  S3E_KEY_STATE_DOWN – Пользователь удерживает нажатой клавишу
•  S3E_KEY_STATE_UP – Клавиша не нажата и не удерживается пользователем
•  S3E_KEY_STATE_PRESSED – Пользователь только что нажал на клавишу
•  S3E_KEY_STATE_RELEASED – Пользователь только что отпустил клавишу
Чтобы запросить положение отдельной клавиши нам нужно вызвать s3eKeyboardGetState(key), что возвращает положения указанной клавиши. Обратите внимание на то,что есть возможность того,что у клавиши может быть более одного положения. Например, если пользователь только что нажал клавишу, то у неё будет сразу два положения: S3E_KEY_STATE_DOWN  и  S3E_KEY_STATE_PRESSED.

On Screen Keyboard


Экранная клавиатура представляет собой программное обеспечение на основе клавиатуры, которое доступно для телефонов и планшетов, поддерживающих сенсорный экран (Вы можете вызвать s3eOSReadStringAvailable(), чтобы определить возможность поддержки). Вы можете вызвать конкретную экраннную клавиатуру ОС довольно легко, используя s3eOSReadStringUTF8() и s3eOSReadStringUTF8WithDefault() Marmalade. Эти функции блокировки отображают конкретную клавиатуру операционной системы и затем возвращают любой введённый текст. Есть возможность предложить системе (путём установки флажка на эти функции), какую клавиатуру вы хотите представить пользователю, чтобы обеспечить разные типы ввода. Доступны следующие типы:
•  No flags – Стандартная клавиатура
•  S3E_OSREADSTRING_FLAG_PASSWORD – Клавиатура для введения пароля
•  S3E_OSREADSTRING_FLAG_EMAIL – Клавиатура для введения e-mail адреса
•  S3E_OSREADSTRING_FLAG_URL – Клавиатура для введения URL
•  S3E_OSREADSTRING_FLAG_NUMBER – Клавиатура для введения номера

CInput Changes


Хорошо, теперь,когда мы прошли основы, давайте рассмотрим изменения в классе CInput. Если Вы не читали предыдущую статью, которая представляла этот класс, тогда можете почитать о нём здесь
Если Вы рассмотрите CInput.h, Вы заметите несколько главных добавлений. Первые несколько добавлений включают в себя файлы заголовков, которые необходмы системам клавиш и экранной клавиатуры:
#include "s3eKeyboard.h"
#include "s3eOSReadString.h"

Переключившись на исходный файл класса CInput.cpp, Вы заметите, что мы добавили несколько дополнительных проверок в CInput::Init()

// Check to see if the device that we are running on supports the keyboard
    KeysAvailable = (s3eKeyboardGetInt(S3E_KEYBOARD_HAS_KEYPAD) || s3eKeyboardGetInt(S3E_KEYBOARD_HAS_ALPHA));

    // Check to see if the device that we are running on supports the on screen keyboard
    OSKeyboardAvailable = s3eOSReadStringAvailable() == S3E_TRUE;

Этот код в основном гарантирует, что модули, которые мы хотим использовать, доступны на устройстве, с которым мы имеем дело.
Далее мы добавляем следующий код в CInput::Update(), чтобы удостовериться, что система обновляет положения клавиш:

// Update key system if it is available
if (KeysAvailable)
    s3eKeyboardUpdate();


И наконец, мы добавляем код, чтобы запрашивать положения клавиш и показывать экранную клавиатуру:

bool CInput::isKeyDown(s3eKey key) const
{
    if (!KeysAvailable)
        return false;

    // Return down state of queried key
    return (s3eKeyboardGetState(key) & S3E_KEY_STATE_DOWN) == S3E_KEY_STATE_DOWN;
}

bool CInput::isKeyUp(s3eKey key) const
{
    if (!KeysAvailable)
        return false;

    // Return up state of queried key
    return (s3eKeyboardGetState(key) & S3E_KEY_STATE_UP) == S3E_KEY_STATE_UP;
}

bool CInput::wasKeyPressed(s3eKey key) const
{
    if (!KeysAvailable)
        return false;

    // Return pressed state of queried key
    return (s3eKeyboardGetState(key) & S3E_KEY_STATE_PRESSED) == S3E_KEY_STATE_PRESSED;
}

bool CInput::wasKeyReleased(s3eKey key) const
{
    if (!KeysAvailable)
        return false;

    // Return released state of queried key
    return (s3eKeyboardGetState(key) & S3E_KEY_STATE_RELEASED) == S3E_KEY_STATE_RELEASED;
}

const char* CInput::showOnScreenKeyboard(const char* prompt, int flags, const char* default_text)
{
    if (!OSKeyboardAvailable)
        return NULL;

    // Show on screen keyboard and return the input string
    if (default_text != NULL)
        return s3eOSReadStringUTF8WithDefault(prompt, default_text, flags);
    else
        return s3eOSReadStringUTF8(prompt, flags);
}

Использование новых возможностей CInput

Если мы теперь обратим внимание на Main.cpp, мы можем просмотреть, что изменилось после нашего предыдущего примера Тач.
Во-первых, отметим, что мы избавились от s3eKeyboardUpdate(); , так как теперь это выполняется с помощью g_Input.Update()
Так же мы заменили следующий код:

if (s3eKeyboardGetState(s3eKeyAbsBSK) & S3E_KEY_STATE_DOWN)    // Back key is used to exit on some platforms
    break;

На этот код:

if (g_Input.isKeyDown(s3eKeyAbsBSK))    // Back key is used to exit on some platforms
    break;

Не много, но лучше читаемо.
Теперь мы добавляем проверку в наш главный цикл, чтобы увидеть, коснулся ли пользователь экрана. Если да, тогда мы показываем экранную клавиатуру.

// if user taps at top of screen then activate on screen keyboard
if (touch->y < 50)
{
    // Show on screen keyboard then print out the returned text to the debug trace
    const char* text = g_Input.showOnScreenKeyboard("Enter Text");
    if (text != NULL)
        s3eDebugOutputString(text);
}

Если пользователь вводит какой-то текст, мы отображаем введённый текст на консоль отладки,используя s3eDebugOutputString()

Работа с кнопками Back и Menu на Android


Стоит отметить, что мы столкнулись с некоторым количеством устройств с приложениями Android, которые требуют особого обращения с кнопками home и menu, как части их процесса сертификации. Эти кнопки должны быть реализованы следующим образом:
•  Back Button – Переход обратно в Вашем приложении, к предыдущему экрану/меню
•  Home Button –Вывод наверх меню в приложении или в игре.
На этом закончим этот туториал. Надеюсь, он оказался Вам полезным. Вы можете скачать соответствующий исходный код проекта по Клавишам здесь
Счастливого кодирования и не садитесь на стулья с двумя ножками!

оригинал тут http://www.drmop.com/index.php/2011/09/28/marmalade-sdk-tutorial-… een-keyboard/

6 июля 2012