Обробка подій клавіатури – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Після безумства минулого пункту варто зробити перепочинок і зайнятися чим-небудь простіше Ласкаво просимо у світ обробки натискань клавіш

Для відстеження подій клавіш ми реалізуємо другий інтерфейс, названий OnKeyLi stener У нього є лише один метод опКеу з наступного сигнатурою:

View визначає вид, який одержує подія натиснення клавіші аргумент keyCode – одна з констант, визначених у класі KeyEvent останній аргумент – власне код клавіші з додатковою інформацією

Що таке код клавіші Кожна клавіша екранної (або фізичної) клавіатури і всі системні кнопки мають присвоєний їм унікальний номер Ці коди клавіш визначені в класі KeyEvent як статичні, відкриті, фінальні, цілочисельні змінні Наприклад, код клавіші KeyEvent KEYC0DE A до ключів А Тут все ясно – при натисканні клавіші на клавіатурі в текстовому полі зявляється символ, що має певний код

Клас KeyEvent схожий на клас MotionEvent У нього є два необхідних нам методу

KeyEvent getActi on – повертає значення KeyEvent ACTI0N D0WN, KeyEvent ACTI0N UP і KeyEvent ACTION MULTI PLE Для наших цілей ми можемо ігнорувати останнє з вказаних типів подій Інші два події генеруються, коли клавіша натиснута і відпущена відповідно

KeyEventgetUnicodeCharО – повертає символ в кодуванні Юнікод, який зявляється в текстовому полі Це може бути схоже на подію з кодом клавіші KeyEvent KEYC0DEA, але в Юнікод Ми можемо використовувати даний метод, якщо хочемо здійснювати текстовий введення самостійно Для отримання подій від клавіатури на View має бути встановлений фокус

Це можна зробити примусово, викликавши наступні методи:

Перший метод гарантує, що на View може бути встановлений фокус Другий запитує отримання фокусу певним уявленням

Створимо невелику тестову активність, щоб поспостерігати за комбінацією цих методів Нам необхідно буде отримувати події від клавіш і показувати останнє отримане нами в TextVi ew У якості інформації виводитиметься тип клавіатурного події, а також код клавіші і її Юнікод-символ (якщо він буде згенерований) Зверніть увагу – деякі клавіші не створюють символи Юнікод самі по собі, а тільки в комбінації з іншими символами Лістинг 45 показує спосіб досягнення всіх цих цілей в декількох рядках коду

Лістинг 45 KeyTestJava тестування API обробки клавіатурних подій package combadogi сandroi dgames

Починаємо з декларації реалізації нашою активністю інтерфейсу OnKeyLi stener Далі визначаємо два члени, з якими ми вже знайомі: Stri ngBuider для створення рядка, що виводиться в TextView, і самого TextVi ew для показу тексту

У методі onCreateO упевняємося в тому, що фокус встановлений в TextView (інакше він не зможе отримувати події клавіатури) Крім того, реєструємо активність в якості OnKeyLi stener методом TextViewsetOnKeyLi stener

Метод опКеу досить прямолінійний Ми обробляємо два типи подій в опесаторе swi ten, додаючи відповідний рядок у Stri ngBui der Після цього ми додаємо код клавіші (а також Юнікод-символ) з KeyEvent і виводимо його в LogCat так само, як і в TextVi ew

Останній вираз if вельми цікаво: якщо натиснута клавіша back, ми повертаємо falsen3 методу опКеу, змушуючи TextView обробляти подія В іншому випадку ми повертаємо true Для чого потрібно це поділ

Повернувши true при натисканні клавіші back, ми злегка втрутимося в життєвий цикл активності Вона не буде закрита, оскільки ми взяли на себе обробку клавіші back Звичайно, існують сценарії, в яких нам якраз необхідно перехоплювати натискання back, щоб активність не закривалася Однак я настійно рекомендую не робити цього без необхідності

Малюнок 48 ілюструє висновок активності при утримуванні клавіш Shift + A на клавіатурі мого Droid

Рис 48 Одночасне натискання Shift + A

Варто відзначити ще пару речей

Якщо ви подивитеся на висновок LogCat, то помітите, що обробка одночасного натискання кількох клавіш не складає жодних проблем

Натискання джойстика і повороти трекбола сприймаються як клавіатурні події

Як і у випадку з подіями торкання, події обробки клавіатури відїдає чималий відсоток потужностей процесора на старих версіях Android і пристроях першого покоління

Це було досить розслаблюючу чтиво в порівнянні з попереднім пунктом, чи не так

ПРИМІТКА

Насправді API з обробки клавіатури трохи складніше, ніж я вам розповів Але для наших ігрових обєктів отриманої в цьому розділі інформації більш ніж достатньо Якщо вам хочеться чогось поскладніше, зверніться до офіційної документації на сайті Android Developers

Читання стану акселерометра Акселерометр – дуже цікавий спосіб введення для ігор Всі пристрої Android повинні оснащуватися трехосевим акселерометром

Все, що нам буде потрібно для її реалізації, – отримати поточний стан акселерометра

Як же отримати цю інформацію Ви вгадали – реєструючи слухача Інтерфейс, який нам необхідно реалізувати, називається SensorEventLi stener Він містить в собі два методи:

Перший метод викликається при виникненні події акселерометра Другий спрацьовує при зміні точності акселерометра (для наших цілей ми спокійно можемо його ігнорувати)

Як же ми зареєструємо SensorEventLi stener Для цього спочатку необхідно проробити деяку попередню роботу Потрібно перевірити, чи є взагалі в апараті акселерометр Тільки що я говорив вам, що всі пристрої на Android повинні їм оснащуватися Це все ще відповідає істині, але раптом в майбутньому щось зміниться Нам необхідно бути на 100% впевненими, що цей метод введення нам доступний

Перше, що нам необхідно зробити, – отримати примірник так званого SensorManager Ця штука розповість нам, чи встановлений акселерометр, а ще саме в ньому ми зареєструємо наш слухач Для отримання SensorManager ми використовуємо метод інтерфейсу Context:

SensorManager – це так званий системний сервіс, що надається системою Android складається з безлічі системних сервісів, кожен з яких пропонує різні сегменти інформації кожному, хто про цьому ввічливо попросить

Тепер, коли у нас є сервіс, ми можемо перевірити доступність акселерометра:

Цей шматочок коду запитує у менеджера всі встановлені датчики типу акселерометр Передбачається, що в пристрої може бути кілька акселерометрів, хоча в реальності метод завжди повертає одну запис

Якщо акселерометр встановлений, ми можемо отримати його дані від SensorManager і зареєструвати наш SensorEventLi stener:

Аргумент SensorManager SENSOR DELAY GAME визначає частоту отримання стану акселерометра Це спеціальна константа, розроблена для ігор, тому було б нерозумно її не використовувати Зверніть увагу – Метод SensorManager regi sterLi stener повертає значення boolean, за яким можна судити, чи успішно завершився процес реєстрації Це означає, що нам необхідно перевіряти це значення для впевненості в тому, що ми отримуємо події від акселерометра

Після реєстрації слухача ми можемо отримувати події SensorEvents в методі SensorEventListeneronSensorChangecK Імя цього методу натякає, що він викликається тільки при зміні стану датчика Це може збентежити – адже стан акселерометра змінюється постійно При реєстрації слухача ми визначаємо частоту, з якою хочемо отримувати оновлення стану датчика

Як же ми обробляємо SensorEvent Досить просто SensorEvent включає в себе відкритий масив значень типу float, названий SensorEvent values У ньому зберігаються поточні значення для кожної з трьох осей акселерометра SensorEvent values ​​[0] містить значення по осіх, SensorEvent values ​​[l] – по осі у і, нарешті, SensorEvent va 1 ues [2] – по осі р

Озброївшись всією цією інформацією, ми можемо приступити до створення простої тестової активності Все, що нам потрібно, – виводити значення акселерометра по кожній осі в елементі TextVi ew У лістингу 46 написано, як це робиться

Лістинг 46 AccelerometerTestJava: тестування API акселерометра package combad ogiсandroidgames

Ми почали з перевірки доступності датчика акселерометра Після успішного тестування отримуємо датчик від SensorManager і намагаємося зареєструвати нашу активність, що реалізовує інтерфейс SensorEventListener Якщо якась з цих операцій закінчується невдачею, в TextVi ew зявляється повідомлення

Метод onSensorChanged просто зчитує значення координат по різних осях від SensorEvent і оновлює відповідним чином вміст TextVi ew

Метод onAccuracyChanged присутній тут тільки тому, що входить до реалізований нами інтерфейс SensorEventLi stener Інших реальних цілей у нього тут немає

На рис 49 показано, які значення осей приймає акселерометр в портретному і ландшафтному режимах (телефон знаходиться перпендикулярно землі) Два фінальних зауваження з акселерометру

Як ви бачите у правій частині рис 49, значення акселерометра іноді можуть виходити за рамки визначеного для них діапазону Це відбувається через невеликі неточностей в роботі сенсора вам необхідно враховуватиме це, щоб отримані вами значення були якомога більш точними

Значення координат осей акселерометра завжди виводяться в одному і тому ж порядку незалежно від поточної орієнтації пристрою

Ось тепер ми обговорили всі необхідні для розробки ігор класи Android API, повязані з обробкою введення

Рис 49 Значення осей акселерометра в портретному (ліворуч) і ландшафтному (праворуч) стані

ПРИМІТКА

Як зрозуміло з назви, клас SensorManager1 може надати доступ і до інших датчикам (наприклад, компасу і сенсору освітленості) Якщо ви хочете придумати щось нове, то можете спробувати написати гру, що використовує їх, – обробка таких подій досить схожа на роботу з акселерометром Документація на сайті Android Developers дасть вам більше інформації

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*