实验9:Android综合实验
1. 播报数字
+1. 声明并初始化SoundPool类、HashMap
private HashMap<String, Integer> spMap=null; //用于管理音频流
private SoundPool sp; // 音频池
private int soundId; // 音频ID
protected void onCreate(Bundle savedInstanceState) {
.
.
.
// 初始化HashMap<String, Integer>类的实例对象spMap
spMap = new HashMap<>();
// 初始化SoundPool类的实例对象sp,并设置最多可容纳16个音频流
sp = new SoundPool(16, AudioManager.STREAM_MUSIC, 0);
.
.
.
}
- 加载音频文件,并用HashMap类来管理加载的音频文件;为按钮添加点击事件
// 用SoundPool类的load方法加载指定音频文件,并用soundId保存返回的音频ID。
// 用HashMap类来管理这些音频流
soundId = sp.load(this, R.raw.zero, 1);
spMap.put("0", soundId);
soundId = sp.load(this, R.raw.one, 1);
spMap.put("1", soundId);
soundId = sp.load(this, R.raw.two, 1);
spMap.put("2", soundId);
soundId = sp.load(this, R.raw.three, 1);
spMap.put("3", soundId);
soundId = sp.load(this, R.raw.four, 1);
spMap.put("4", soundId);
soundId = sp.load(this, R.raw.five, 1);
spMap.put("5", soundId);
soundId = sp.load(this, R.raw.six, 1);
spMap.put("6", soundId);
soundId = sp.load(this, R.raw.seven, 1);
spMap.put("7", soundId);
soundId = sp.load(this, R.raw.eight, 1);
spMap.put("8", soundId);
soundId = sp.load(this, R.raw.nine, 1);
spMap.put("9", soundId);
soundId = sp.load(this, R.raw.ac, 1);
spMap.put("ac", soundId);
soundId = sp.load(this, R.raw.del, 1);
spMap.put("del", soundId);
soundId = sp.load(this, R.raw.div, 1);
spMap.put("div", soundId);
soundId = sp.load(this, R.raw.dot, 1);
spMap.put(".", soundId);
soundId = sp.load(this, R.raw.equal, 1);
spMap.put("equal", soundId);
soundId = sp.load(this, R.raw.minus, 1);
spMap.put("minus", soundId);
soundId = sp.load(this, R.raw.mul, 1);
spMap.put("mul", soundId);
soundId = sp.load(this, R.raw.plus, 1);
spMap.put("plus", soundId);
// 为按钮设置点击监听事件
findViewById(R.id.btn0).setOnClickListener(this);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
findViewById(R.id.btn4).setOnClickListener(this);
findViewById(R.id.btn5).setOnClickListener(this);
findViewById(R.id.btn6).setOnClickListener(this);
findViewById(R.id.btn7).setOnClickListener(this);
findViewById(R.id.btn8).setOnClickListener(this);
findViewById(R.id.btn9).setOnClickListener(this);
findViewById(R.id.btnadd).setOnClickListener(this);
findViewById(R.id.btnsub).setOnClickListener(this);
findViewById(R.id.btnmul).setOnClickListener(this);
findViewById(R.id.btndiv).setOnClickListener(this);
findViewById(R.id.btnclr).setOnClickListener(this);
findViewById(R.id.btneq).setOnClickListener(this);
- 根据点击按钮的侦听事件,确定播放哪个音频文件
public void onClick(View v) {
switch(v.getId()){
case R.id.btn0:
textView1.append("0"); //在UI界面的TextView中显示 0
sp.play(spMap.get("0"), 1, 1, 0, 0, 1); //播放音频流
break;
case R.id.btn1:
textView1.append("1");
sp.play(spMap.get("1"), 1, 1, 0, 0, 1);
break;
case R.id.btn2:
textView1.append("2");
sp.play(spMap.get("2"), 1, 1, 0, 0, 1);
break;
case R.id.btn3:
textView1.append("3");
sp.play(spMap.get("3"), 1, 1, 0, 0, 1);
break;
case R.id.btn4:
textView1.append("4");
sp.play(spMap.get("4"), 1, 1, 0, 0, 1);
break;
case R.id.btn5:
textView1.append("5");
sp.play(spMap.get("5"), 1, 1, 0, 0, 1);
break;
case R.id.btn6:
textView1.append("6");
sp.play(spMap.get("6"), 1, 1, 0, 0, 1);
break;
case R.id.btn7:
textView1.append("7");
sp.play(spMap.get("7"), 1, 1, 0, 0, 1);
break;
case R.id.btn8:
textView1.append("8");
sp.play(spMap.get("8"), 1, 1, 0, 0, 1);
break;
case R.id.btn9:
textView1.append("9");
sp.play(spMap.get("9"), 1, 1, 0, 0, 1);
break;
case R.id.btnadd:
sp.play(spMap.get("plus"), 1, 1, 0, 0, 1);
items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
checkAndcompute();
items.add(new Item(0, Type.add));
textView1.setText("");
break;
case R.id.btnsub:
sp.play(spMap.get("minus"), 1, 1, 0, 0, 1);
items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
checkAndcompute();
items.add(new Item(0, Type.sub));
textView1.setText("");
break;
case R.id.btnmul:
sp.play(spMap.get("mul"), 1, 1, 0, 0, 1);
items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
checkAndcompute();
items.add(new Item(0, Type.mul));
textView1.setText("");
break;
case R.id.btndiv:
sp.play(spMap.get("div"), 1, 1, 0, 0, 1);
items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
checkAndcompute();
items.add(new Item(0, Type.div));
textView1.setText("");
break;
case R.id.btneq:
sp.play(spMap.get("equal"), 1, 1, 0, 0, 1);
items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
checkAndcompute();
textView1.setText(items.get(0).value + "");
String str = items.get(0).value+"";
new Test(str).start(); // 启动另一个线程来播放结果
items.clear();
break;
case R.id.btnclr:
sp.play(spMap.get("ac"), 1, 1, 0, 0, 1);
textView1.setText("");
}
}
- 对于结算结果的音频播放:(1)先把计算结果转成字符串型,再启动一个子线程来处理该字符串;(2)子线程获取传过来的计算结果的字符串后,停止播放的“等于”对应的音频,然后利用for循环语句和String类的substring()方法把计算结果一位一位的截取出来,并播放对应的音频文件。
```
class Test extends Thread{.
.
String str = items.get(0).value+"";
new Test(str).start(); // 启动另一个线程来播放结果
.
.
}private String result; //计算的结果
public Test(String s){
this.result = s;
}
@Override
public void run() {
String s;
sp.stop(spMap.get("equal"));
// 用for循环把计算结果分割成对应spMap中的key
for(int i=0; i<result.length(); i++){
try {
Thread.sleep(350); //该线程睡350毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
s = result.substring(i, i+1);
sp.play(spMap.get(s), 1, 1, 0, 0, 1);
}
}