Страницы

воскресенье, 30 марта 2014 г.

Delphi for Android: играем звук при встряхивании

Обещанного 3 года ждут. А план таков, что программку для детей мы всё-равно еще не скоро допишем (сомневаюсь что есть смысл её дописывать).

Поэтому давайте зафигачим что-нибудь простенькое и бесполезное. Например что-то типа эмулятора кнута Индианы Джонса. As seen on tv. Типа того, что показывали в Теории Большого Взрыва много лет сезонов назад. Только вместо кнута будем использовать колокольчик. А назовём проект LazyShaker.

Для тех, кто предпочитает не засорять сознание ситкомами расскажу суть. Программка должна воспроизводить звук при встряхивании. Всё. Способы применения - самые разнообразные, но в основном одинаково бесполезные и ограничивающиеся привлечением внимания.

Исходный код проекта я выложил на github. А собранное приложение на Google Play.

Под катом объяснение того как всё это работает.

Работа с сенсором

Для отслеживания встряхивания воспользуемся компонентом TMotionSensor. Опрашивать сенсор будем по таймеру (как это показано в демке), каждые 5 миллисекунд.

Сделаем свой класс TLazyShakeSensor реализующий следующий интерфейс:

  TLazyShakeSensor = class
  public
    procedure InitSensors;
    procedure DeInitSensors;
    property OnShake: TNotifyEvent read FOnShake write FOnShake;
  end;

Внутри класса спрячем:

    FMotionSensor: TMotionSensor;
    FTimer: TTimer;

    // обработчик события OnTimer для таймера

    procedure DoOnSensorDataChanged(Sender: TObject);

    // а этот метод будет вызывать событие OnShake
    procedure DoTriggerShakeEvent;

Воспроизведение звука

А для воспроизведения звука - нам вполне хватит стандартного TMediaPlayer-а. Просто бросим компонент TMediaPlayer на форму. Также сделаем метод PlayDefaulSound - который будет проигрывать звук.

Сам звук добавим в проект через Deployment Manager. Это будет mp3 файл, который я нашёл через find-sounds.org. Для добавленного файла изменим destination path с .\ на .\assets\internal. См. скриншот ниже.

Appmethod deployment manager

Внутри формы создадим экземпляр класса TLazyShakeSensor и назначим ему обработчик события. В качестве обработчика просто объявим в коде формы свою процедуру с сигнатурой как у типа TNotifyEvent (procedure ProcName(Sender: TObject)). Из обработчика будем вызывать метод формы PlayDefaultSound;

GUI

Нам нужна возможность полностью закрыть программу, чтобы она не продолжала работать в фоне и не звенела при ходьбе. Для этого добавим на форму кнопку, к которой прикрепим стандартный action TFileExit.

А чтобы форма не пустовала, добавим туда TImage с картинкой. Картинку возьмём в png формате на сайте OpenClipart (лицензия Public Domain). hint: Размер картинки выбирайте сами какой хотите. Здесь я не советчик, так как до сих пор не понимаю, каким образом эта картинка будет масштабироваться на устройствах с разным разрешением. Идеальным вариантом, конечно был бы использовать SVG, но к сожалению, ни android ни firemonkey такой возможности не предоставляют.

Ссылки по теме

Комментариев нет:

Отправить комментарий