如何在自定义键盘中播放声音

时间:2015-06-03 10:09:20

标签: java android audio

我最近制作了自己的键盘,始终向用户显示。 我也发现了如何在按键的同时播放声音,但是如果我按下一个然后按下另一个,则只播放第一个声音。 是否有任何方法可以在每次按键时播放声音,即使它们之间的间隔为0.1毫秒? 这是我的代码:

 final MediaPlayer mp = MediaPlayer.create(this, R.raw.sn_tecla);
 final MediaPlayer mpspc = MediaPlayer.create(this, R.raw.sn_spc);
    texto1.setTypeface(fuente);


    //This is for each key.
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mp.start();
            texto1.setText(texto1.getText() + "1");

        }
    });

提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用soundpool http://developer.android.com/reference/android/media/SoundPool.html

SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
/** soundId for Later handling of sound pool **/
int soundId = sp.load(MainActivity.this, R.raw.windows_8_notify, 1); // in 2nd param u    have to pass your desire ringtone

sp.play(soundId, 1, 1, 0, 0, 1);

答案 1 :(得分:0)

您可以通过为每个按钮声明一个mediaPlayer对象来解决您的问题(略微开销,但它有效)。 另外,使用 onTouchListener 代替 onClickListener

例如:如果您有2个按钮且每个按钮必须发出相同的声音,您的代码将如下所示:

final MediaPlayer[] mediaPlayers = new MediaPlayer[2];

    for(int i =0;i<2;i++){

        //if both buttons ought to have the same sound
        mediaPlayers[i] = MediaPlayer.create(getApplicationContext(), R.raw.beep);
        mediaPlayers[i].setLooping(true);

    }

    button1.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            //when the user presses the button
            if(event.getAction() == MotionEvent.ACTION_DOWN)
                {
                mediaPlayers[0].start();
                texto1.setText(texto1.getText() + "1");
                }

            //when the user releases the button
            if(event.getAction() == MotionEvent.ACTION_UP){
                mediaPlayers[0].pause();


            }

            return false;
        }
    });
    button2.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN)
               {
                mediaPlayers[1].start();
                texto1.setText(texto1.getText() + "1");
               }
            if (event.getAction() == MotionEvent.ACTION_UP) {
                mediaPlayers[1].pause();

            }

            return false;
        }
    });

希望这适合你!