Скачиваний:
15
Добавлен:
17.06.2023
Размер:
414.72 Кб
Скачать

Работаем со звуками 

Напишем программу, которая поможет определить, кто-же сказал Мяу? Меня всегда интересовал данный вопрос.

Подготовим заранее картинки различных животных и создадим разметку:

Положим подготовленные аудио-файлы с голосами животных в директорию assets.

Переходим к программной части. Нам надо создать объект SoundPool, загрузить в него аудио-файлы из папки assetsметодом load().

Зададим максимальное количество одновременно проигрываемых потоков - 3.

Для интереса отловим событие OnLoadComplete.

При нажатии на кнопку будем проигрывать нужный звук.

При загрузке файлов метод load() возвращает идентификатор soundID, который нам нужно как-то сохранить для дальнейшего использованию. Объявим для каждого звука отдельную переменную, если же звуков много лучше завести для этого ассоциативный массив.

Файловый дескриптор AssetFileDescriptor для файла из директории assets получаем с помощью метода openFd(), принимающего в качестве параметра имя файла. Если файл не найден или не может быть открыт, то выводим сообщение и в качестве soundID возвращаем -1.

Ради любопытства посмотрим как быстро у нас загружаются ресурсы, для этого напишем обработчик события OnLoadComplete (закомментировано).

Каждый раз когда заканчивается загрузка выводим сообщение в лог и если она закончилась успешно (status равен 0), то увеличиваем количество загруженных звуков countLoadedSound. Когда это количество равно 6, сообщаем об успешной загрузке.

Если мы запустим приложение, то увидим, что есть небольшая пауза между стартом программы и выводом сообщения об успешной загрузке файлов. В реальных приложениях это нужно учитывать, например, выводить диалог "Waiting", пока загрузка не закончится. Если наличие звука критично, нужно как-то обрабатывать все ошибки, связанные с загрузкой файлов. Мы этим заниматься не будем, ограничимся только записями в логах.

По нажатию кнопки вызываем метод playSound(), передавая ему нужный идентификатор звука. В методе проверяем этот идентификатор. Если файл у нас не был найден, то метод loadSound() возвращал -1, а если метод load() класса SoundPool не смог загрузить файл, то soundID будет равен 0, поэтому проверяем, что SoundID > 0, что означает, что файл был успешно загружен. Если же все хорошо, то вызываем метод play().

Запустим программу и выясним, так кто-же сказал Мяу?

Написано по мотивам статьи Звуковые эффекты. Там же можно скачать исходник с картинками и звуками.

Один из читателей захотел выводить звук не через щелчок, а нажатие на кнопку. А когда палец открывается от экрана, то звук должен прекращаться. Получился интересный эффект, который мы нашли сообща. Код для кнопки с коровой (предыдущий код лучше убрать).

При воспроизведении звука мы получаем его идентификатор, который используемый для остановки воспроизведения.