最近项目中遇到的一个需求:点击金币,播放金币掉落的声音。实现方式如下:
1. 在res下新建raw,把资源文件coin_click.wav放进去
sybil052-20190723-163221.png2. 建立单例类
代码如下:
public class SoundPoolUtil {
private static SoundPoolUtil soundPoolUtil;
private SoundPool soundPool;
//单例模式
public static SoundPoolUtil getInstance(Context context) {
if (soundPoolUtil == null)
soundPoolUtil = new SoundPoolUtil(context);
return soundPoolUtil;
}
@SuppressLint("NewApi")//这里初始化SoundPool的方法是安卓5.0以后提供的新方式
private SoundPoolUtil(Context context) {
soundPool = new SoundPool.Builder().build();
//加载音频文件
soundPool.load(context, R.raw.coin_click, 1);
}
public void play(int number) {
Log.d(TAG, "number " + number);
/**
* 播放音频
* params说明:
* //左耳道音量【0~1】
* //右耳道音量【0~1】
* //播放优先级【0表示最低优先级】
* //循环模式【0表示循环一次,-1表示一直循环,其他表示数字+1表示当前数字对应的循环次数】
* //播放速度【1是正常,范围从0~2】
*/
soundPool.play(number, 1, 1, 0, 0, 1);
}
}
3. 具体使用
代码如下:
private void initView() {
soundInstance = SoundPoolUtil.getInstance(this);
...
mCoinView.setOnCoinClickListener(new CoinView.CoinClickListener() {
@Override
public void coinClick(View v, CoinBean coinBean) {
if(coinBean == null){
showDialog();
return;
}
final float x = v.getX();
final float y = v.getY();
// 播放音效
soundInstance.play(1);
// 请求接口
stealVK(v, x, y, coinBean.getId());
// 移除金币
Iterator<CoinBean> iterator = mCoinBeans.iterator();
while (iterator.hasNext()) {
CoinBean c = iterator.next();
if (c.getId() == coinBean.getId()) {
iterator.remove();
}
}
// 展示新一轮金币
if(mCoinBeans.size() == 0 && allCoins.size() != 0){
index += 1;
maxCount -= 1;
if(allCoins.size() > index){
mCoinBeans.addAll(allCoins.get(index));
if(maxCount > mCoinBeans.size()){
mCoinView.setCoins(mCoinBeans, mCoinBeans.size());
}else {
mCoinView.setCoins(mCoinBeans, maxCount);
}
}
}
totalNum = FormateUtil.add(totalNum, coinBean.getNumber());
NumAnim.startAnim(tvVkNum, Double.parseDouble(totalNum));
addTextView(v, coinBean.getNumber());
}
});
}
网友评论