【问题标题】:Android soundpool loop logicAndroid soundpool 循环逻辑
【发布时间】:2015-10-21 05:23:56
【问题描述】:

我有两个按钮可以循环播放相同优先级的音池文件。因此,如果 1 个按钮正在循环播放,而另一个按钮被按下,则此按钮停止,而另一个按钮开始播放。 到这里为止还好。 现在假设我有每个 2 秒的声音文件,在按下 btn 2 后,btn 1 应该完成文件 1 的声音,即如果刚刚开始和停止,它应该播放 2 秒。如何做到这一点?

目前如果我播放btn2,btn 1会在文件未完成播放的那一刻停止播放并启动文件2。我希望在停止之前完全播放文件1。

请帮忙!

【问题讨论】:

    标签: android loops soundpool


    【解决方案1】:

    我不认为你可以用声音池来实现,因为声音池没有 OnComletionListener 或 isPlaying 方法。

    实现这一点的唯一方法是创建一个新线程来侦听队列大小并在媒体播放器不播放时使用新 ID 启动媒体播放器。参考下面的代码

    private Queue<Integer> qSoundID;
    private MediaPlayer mp;
    
    private void init(){
        yourButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                qSoundID.add(R.raw.yoursoundid);
            }
        });
    
        qSoundID = new LinkedList<Integer>();
    
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (qSoundID.size() > 0) {
                        if(mp==null||!mp.isPlaying()){
                            mp = MediaPlayer.create(MainActivity.this, qSoundID.poll());
                            mp.start();
                        }
    
                    }
                }
            }
        }).start();
    }
    

    或者在 MediaPlayer 上设置 OnCompletionListener 将播放下一个声音 id。参考下面的代码

    private Queue<Integer> qSoundID;
    private MediaPlayer mp;
    
    private void init() {
        yourButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                int soundID = R.raw.yoursoundid;
                playSound(soundID);
            }
        });
        qSoundID = new LinkedList<Integer>();
    }
    
    private void playSound(int soundID) {
        if (mp == null || !mp.isPlaying()) {
            mp = MediaPlayer.create(MainActivity.this, soundID);
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    playSound(qSoundID.poll());
                }
            });
            mp.start();
        }
        else{
            qSoundID.add(soundID);
        }
    }
    

    【讨论】:

    • 好吧,这无济于事,因为我使用声音池的循环属性是有原因的。我有许多平均为 2 秒的声音,我希望仅在当前声音在循环中完成播放(完成其 2 秒)时才优先播放下一个声音。还是谢谢!
    • 在使用媒体播放器时,也可以调用MediaPlayer.setLooping(true);
    • 然后你可以编写你的逻辑在 OnCompletionListener 上播放下一个声音,希望这会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2019-01-08
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多