如何一次只播放一个声音?

时间:2018-09-18 14:24:17

标签: android

我有两个具有不同声音的ImageView,当单击其中一个时,它们会播放声音。单击第一个ImageView时,我要播放声音,并且在第一个ImageView播放完声音之前,如果单击第二个ImageView,则我想限制第二个ImageView播放声音,因为第一个ImageView仍在播放声音。实际上,我想限制一种声音在播放另一种声音时播放。但是,我没有得到想要的结果。

public class Transportation extends AppCompatActivity {

        private MediaPlayer sound,sound1;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.transportation);


            sound = MediaPlayer.create(this,R.raw.vatunabus);
            final ImageView imageView= (ImageView)findViewById(R.id.vatunabussound);
            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if(sound1.isPlaying()){
                        sound.stop();
                        sound.release();
                    }
                    else if(sound.isPlaying()){
                        sound.pause();
                        imageView.setBackgroundResource(R.mipmap.playicon);
                    }
                    else {
                        sound.start();
                        imageView.setBackgroundResource(R.mipmap.pauseicon);
                    }
                }
            });
            sound.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    imageView.setBackgroundResource(R.mipmap.playicon);
                }
            });


            sound1 = MediaPlayer.create(this,R.raw.varowlsanabus);
            final ImageView imageView1 = (ImageView)findViewById(R.id.firstbussound);
            imageView1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if(sound.isPlaying()){
                        sound1.stop();
                        sound1.release();
                    }
                    else if(sound1.isPlaying()){
                        sound1.pause();
                        imageView1.setBackgroundResource(R.mipmap.playicon);
                    }
                    else {
                        sound1.start();
                        imageView1.setBackgroundResource(R.mipmap.pauseicon);
                    }

                }
            });
            sound1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    imageView1.setBackgroundResource(R.mipmap.playicon);
                }
            });

        }

    }

1 个答案:

答案 0 :(得分:0)

这是个主意,让我们创建一个布尔值来告诉我们当前是否正在播放声音。

private MediaPlayer sound,sound1;
private boolean soundPlaying = false; //new boolean variable

接下来,在播放声音之前,我们将进行检查以确保其仍然为假:

public void onClick(View v) {
    //Add a check that exits the function if a sound is playing
    //Add this check in both onClick methods
    if(soundPlaying){
      return;
    }
    ...
}

此外,在sound.start()sound1.start()之后,让我们将布尔值设置为true:

 soundPlaying = true;

最后,在两种onCompletion方法实例中,让我们将布尔值重置为false:

public void onCompletion(MediaPlayer mp) {
   soundPlaying = false;
   ...
}

最终代码如下:

public class Transportation extends AppCompatActivity {

    private MediaPlayer sound,sound1;
    private boolean soundPlaying = false; //new boolean variable

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.transportation);


        sound = MediaPlayer.create(this,R.raw.vatunabus);
        final ImageView imageView= (ImageView)findViewById(R.id.vatunabussound);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            //Add a check that exits the function if a sound is playing
            if(soundPlaying){
              return;
            }
                if(sound1.isPlaying()){
                    sound.stop();
                    sound.release();
                }
                else if(sound.isPlaying()){
                    sound.pause();
                    imageView.setBackgroundResource(R.mipmap.playicon);
                }
                else {
                    sound.start();
                    imageView.setBackgroundResource(R.mipmap.pauseicon);
                }
            }
        });
        sound.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                soundPlaying = false;
                imageView.setBackgroundResource(R.mipmap.playicon);
            }
        });


        sound1 = MediaPlayer.create(this,R.raw.varowlsanabus);
        final ImageView imageView1 = (ImageView)findViewById(R.id.firstbussound);
        imageView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Add a check that exits the function if a sound is playing
                if(soundPlaying){
                  return;
                }
                if(sound.isPlaying()){
                    sound1.stop();
                    sound1.release();
                }
                else if(sound1.isPlaying()){
                    sound1.pause();
                    imageView1.setBackgroundResource(R.mipmap.playicon);
                }
                else {
                    sound1.start();
                    imageView1.setBackgroundResource(R.mipmap.pauseicon);
                }

            }
        });
        sound1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                soundPlaying = false;
                imageView1.setBackgroundResource(R.mipmap.playicon);
            }
        });

    }

}

我希望这会有所帮助。不过,无法在实时代码中尝试使用它,所以让我知道它的运行方式。