大家好,这是2022年!
在我的文字游戏应用中,我们的方法不是触碰AudioManager!
这意味着我从未调用以下代码:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE)
原因是如果用户尝试更改应用程序中的声音音量,但电话和音乐的总体音量也会改变,她会感到不愉快。
因此,我只需将0.1到1.0之间的因子值保存到共享首选项中,然后在播放游戏中的任何声音时将整体电话音量乘以该因子。
在我的应用程序的设置片段中,我有一个材料滑块:
<com.google.android.material.slider.Slider
android:id="@+id/volumeFactorSlider"
android:layout_weight="8"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:contentDescription="Volume"
android:valueFrom="0.1"
android:valueTo="1.0" />
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
View v = inflater.inflate(R.layout.fragment_settings, container, false);
Slider volumeFactorSlider = v.findViewById(R.id.volumeFactorSlider);
float volumeFactor = prefs.getFloat(KEY_VOLUME, 1.0f);
volumeFactor = Math.max(volumeFactorSlider.getValueFrom(), volumeFactor);
volumeFactor = Math.min(volumeFactor, volumeFactorSlider.getValueTo());
volumeFactorSlider.setValue(volumeFactor);
volumeFactorSlider.addOnSliderTouchListener(new Slider.OnSliderTouchListener() {
@Override
public void onStartTrackingTouch(@NonNull Slider slider) {
}
@Override
public void onStopTrackingTouch(@NonNull Slider slider) {
prefs.edit().putFloat(KEY_VOLUME, slider.getValue()).apply();
}
});
return v;
}
在播放声音的游戏片段中,我使用以下代码:
。
private SoundPool mSoundPool;
private float mVolumeFactor;
private int mShuffleSound;
private int mBonusSound;
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
mVolumeFactor = prefs.getFloat(KEY_VOLUME, 1.0f);
mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
mShuffleSound = mSoundPool.load(requireContext(), R.raw.shuffle, 1);
mBonusSound = mSoundPool.load(requireContext(), R.raw.magic, 1);
....
}
@Override
public void onDestroy() {
super.onDestroy();
mSoundPool.release();
mSoundPool = null;
}
最后,当播放声音时,我只需乘以这个因子:
private void playSound(int soundId) {
mSoundPool.play(soundId, mVolumeFactor, mVolumeFactor, 1, 0, 1f);
}
例如,在洗牌字母块的时候:
playSound(mShuffleSound);