android 为什么我的声音池在这两种情况下表现不同?(分配给stream的值soundpool.play从未使用)

2admgd59  于 2022-12-21  发布在  Android
关注(0)|答案(1)|浏览(116)

我想在用户触摸按钮时播放声音,并在手指抬起时停止声音。这是我的试用代码,可以按我的要求工作:

public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction()){
                        case MotionEvent.ACTION_DOWN:
                            // -1 so it keeps looping
                            fStream = soundPool.play(F4, 1, 1,0,-1,1);
                            return true;
                        case MotionEvent.ACTION_UP:
                            soundPool.stop(fStream);
                    }
                return false;
            }

这是我希望在应用程序中应用一些条件后放置的代码:
x一个一个一个一个x一个一个二个一个x一个一个三个一个
问题是:
在试用代码中,当我按住按钮时,声音会循环播放。当我抬起手指时,声音会停止。但在我的应用程序中,当我抬起手指时,声音不会立即停止。它会播放整个音频,不管是否循环播放。(现在,当它循环播放时,声音永远不会停止)。我尝试过将soundpool.stop(aStream)直接放入MotionEvent.ACTION_UP,但效果还是一样。
In the rotate_method , the stream variable has an underline and it says "The value soundPool.play(sharp, 1, 1, 0, loop_num, 1) assigned to stream is never used." Like yeah it's not used, it's just for playing the audio.
试用代码没有此"免责声明"。
我做错了什么?为什么Soundpool在试用代码和我的应用程序中的行为不同?

6ie5vjzr

6ie5vjzr1#

SoundPool.play()返回您想要停止播放时所需的streamID。
在您的试用代码中,将该值赋给某个字段fStream

fStream = soundPool.play(F4, 1, 1,0,-1,1);

并在您想要停止播放时使用它来停止播放:

soundPool.stop(fStream);

在您的“生产”代码中,您将该值赋给一个参数:

public void rotate_method(int note, int sharp, int stream, int loop_num){
    stream = soundPool.play(sharp, 1, 1,0,loop_num,1);
    // stream is a method parameter here and changes are lost!
}

您必须将返回值存储在某个字段中-为什么不重用上一个示例中的字段呢?

public void rotate_method(int note, int sharp, int stream, int loop_num){
    fStream = soundPool.play(sharp, 1, 1,0,loop_num,1);
}

既然你现在不再需要这个参数了,你应该把它从方法中移除:

public void rotate_method(int note, int sharp, int loop_num){
    fStream = soundPool.play(sharp, 1, 1,0,loop_num,1);
}

此更改将传播回调用方法。

相关问题