2013-09-29 1 views
0

Я новичок в Android, и я хотел бы воспроизвести звук в зависимости от кнопки, нажатой пользователем.Android: Как воспроизводить звук в зависимости от нажатой кнопки?

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

Что я хочу сделать, это найти способ динамически установить параметр R.raw.arthaswhat5 так, чтобы он был настроен на последнюю нажатую кнопку.

public void listen(View w){ 
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.arthaswhat5); 
    mediaPlayer.start(); 
} 

Я думал, что называя пуговицы так же, как мои файлы могли бы помочь, но я не очень понимаю, как это работает R вещь ... Я знаю, что могу получить v.getId() Int знать которая нажата, но я не могу использовать этот идентификатор для воспроизведения звука соответственно ...

ответ

0

R.raw как R.id в основных словах, таких как указатель на то, где эти значения были сохранены.

Когда вы сохраняете изображение или файл wav под сырой папкой, после обновления проекта вы можете назвать его R.raw.arthaswhat5, который возвращает int.

Точно так же R.id генерируется при добавлении нового элемента GUI.

Зависимость между R.raw и R.id. R.raw указывает на необработанную папку, когда R.id указывает на ваш XML.

from `View` you can fetch id to you it for `if` statement or `switch` 

как

if (v.getId() == R.id.your_button){ /*...*/} 

[Edit]

, если у вас есть> 100 песен я хотел бы использовать assets папку вместо raw. Потому что в raw все имена должны быть в нижнем регистре, и вы не можете создавать там подкаталоги. Будет сложно обрабатывать и поддерживать.

+0

Хорошо, я вижу. Но я должен сделать игру огромной библиотекой звуков (более 100). В соответствии с тем, что вы говорите, мне придется создать ArrayList или что-то вроде этого, содержащее , однако я создам интерфейс на ходу, чтобы сделать выбор папки доступным для пользователя. Знаете ли вы, есть ли способ получить идентификатор ранее созданного элемента GUI? – user2377141

+0

Если у вас есть 100 песен, я бы использовал папку 'assets' вместо' raw'. Потому что в 'raw' все имена должны быть строчными, и вы не можете создать там подкаталог. http://stackoverflow.com/questions/3289038/play-audio-file-from-the-assets-directory. И да, просто создайте «Список» названий песен –

1

Вы хотите использовать Sound Pool http://developer.android.com/reference/android/media/SoundPool.html

В вашей папке «Рес» добавить папку под названием «сырой» и положить ваши звуковые файлы там. Я использовал файлы .m4a, и это сработало для меня, но я не уверен, какие другие форматы поддерживаются.

Вот отрывок из кода, который я использовал в своем приложении, играть звук можно использовать следующий код:

int flip = 1,scratch = 2,wrong = 3,correct = 4,pop = 5; 
SoundPool soundPool; 
HashMap<Integer, Integer> soundPoolMap; 

setVolumeControlStream(AudioManager.STREAM_MUSIC); 

soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 100); 
soundPoolMap = new HashMap<Integer, Integer>(); 
soundPoolMap.put(flip, soundPool.load(this, R.raw.flip, 1)); 
soundPoolMap.put(scratch, soundPool.load(this, R.raw.scratch, 1)); 
soundPoolMap.put(wrong, soundPool.load(this, R.raw.wrong, 1)); 
soundPoolMap.put(correct, soundPool.load(this, R.raw.correct, 1)); 
soundPoolMap.put(pop, soundPool.load(this, R.raw.pop, 1)); 

soundPool.play(soundPoolMap.get(flip), 1, 1, 1, 0, 1); 

Edit: Почти полностью пренебрегли часть вашего вопроса. Вы должны использовать переключатель/случай область для определения, какая кнопка нажата и применить правильный звук к нему соответствующим образом:

public void listen(View v) { 
    switch(v.getId()) { 
     case (R.id.button1): 
     soundPool.play(soundPoolMap.get(flip), 1, 1, 1, 0, 1); 
     break; 
     case (R.id.button2): 
     soundPool.play(soundPoolMap.get(scratch), 1, 1, 1, 0, 1); 
     break; 
     case (R.id.button3): 
     ... 
    } 
} 
+0

Спасибо, это пригодится :) – user2377141

0

Почему не у использовать переключатель-случай подобное заявление?

public void listen(View v){ 
    MediaPlayer mediaPlayer; 
    switch(v.getid()) { 
     case (R.id.sound1): 
     mediaPlayer = MediaPlayer.create(this, R.raw.arthaswhat5); 
     mediaPlayer.start(); 
     break; 
     case (R.id.sound2): 
     mediaPlayer = MediaPlayer.create(this, R.raw.arthaswhat6); 
     mediaPlayer.start(); 
     break; 
     case (R.id.sound3): 
     ... 
     ... 
     ... 
     case (...) 
     ... 
     ... 
     ... 
    } 
} 
+0

Мне нужно сделать эту динамику, потому что в моем приложении будет сотни звуков. Мне нужно будет избавиться от инструкции if и просто воспроизвести звук, сделав что-то вроде: 'MediaPlayer mediaPlayer = MediaPlayer.create (это, MediaHashMap.get (buttonPressed));' – user2377141

 Смежные вопросы

  • Нет связанных вопросов^_^