最近在项目中碰到需要设置音效开关的需求。
关于音效开发的问题,都是建立在手机系统设置中,没有静音,且打开了选择操作音的前提下。
1.系统自带的点击声音(通过设置View.playSoundEffect ()实现)
看源码请参考http://blog.csdn.net/jdsjlzx/article/details/17382455
在项目所以的Activity的抽象基类BaseActivity中复写findViewById方法,通过配置文件记录音效开关
/**
* 重写findViewById()方法,设置控件是否有按键声音
* */
@Override
public View findViewById(int id) {
// TODO Auto-generated method stub
View v = super.findViewById(id);
if (v != null) {
if (mAppConfig.soundOn()) {
v.setSoundEffectsEnabled(true);
} else {
v.setSoundEffectsEnabled(false);
}
}
return v;
}
playSoundEffect方法对包括TextView,Button,GridView的item点击,ListView等等控件在内都是适用的,这个可以根据View的源码看到,但是我在项目中碰到的例如RadioGroup,就只能通过以下代码实现点击切换时的音效了(RadioGroup)rgTab.setOnCheckedChangeListener(onCheckedChangeListener);
private OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(new AppConfig(MainActivity.this).soundOn()){
rgTab.setSoundEffectsEnabled(true);
rgTab.playSoundEffect(SoundEffectConstants.CLICK);//按键音效
}
switch(checkedId){
case R.id.rb_1:
break;
case R.id.rb_2:
break;
case R.id.rb_3:
break;
}
}
};
另外,碰到GridView和ListView中item下绑定的控件,必须也得添加音效的设置了,这点不能忘记。
(RadioGroup)rgTab.setOnCheckedChangeListener(onCheckedChangeListener);
private OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(new AppConfig(MainActivity.this).soundOn()){
rgTab.setSoundEffectsEnabled(true);
rgTab.playSoundEffect(SoundEffectConstants.CLICK);//按键音效
}
switch(checkedId){
case R.id.rb_1:
break;
case R.id.rb_2:
break;
case R.id.rb_3:
break;
}
}
};
总结:建议在项目中尽量使用自定义的控件,这样不必每处都修改了
2.通过SoundPool播放自定义音效
参考http://blog.csdn.net/qq435757399/article/details/8010015
里面说的已经很详细了,我之前的测试结果是,好像会先播放系统自带的点击音效,再接着播放我们自定义的音效,应该可以通过在xml布局中为控件添加android:soundEffectsEnabled="false"来避免吧
欢迎大家指出不当之处!!