它是一个节拍器应用程序,但这部分基本上像鼓机一样工作。我有一个单独的线程,它在我调用 play() 的函数中不断将声音字节和零字节写入 AudioPlayer。在我的主线程上,我动态生成一些按钮来设置重音节拍,并将其存储在 play() 函数循环遍历的数组中,并根据数组中的值播放重音、非重音或沉默。
这是我的主要活动。 generateButton() 函数只是动态地生成不同数量的按钮并将它们存储在一个数组中。每次用户更改按钮的数量时,我都会运行此函数以生成新的 n 个按钮。每次用户按下按钮时,我都会更新节拍器中的重音数组。我使用 flexbox 布局来均匀分布按钮。
flexboxLayout = (FlexboxLayout) findViewById(R.id.flexboxContainer);
generateButtons();
我创建了一个类只是为了制作线程节拍器实例。像这样:
public class MetronomeThread extends Thread{
Metronome metronome;
MetronomeThread(Context context, double bpm, int state[]){
metronome = new Metronome(context, bpm, state);
}
@Override
public void run() {
metronome.loadSound();
metronome.play();
}
public void end(){
metronome.stop();
metronome = null;
}
public void setBpm(double bpm){
metronome.setBpm(bpm);
}
public void calcSilence(){
metronome.calcSilence();
}
public void updateAccentArray(int[] array){
metronome.updateAccentArray(array);
}
}
这是 Metronome 类中循环遍历重音数组的函数:
public void play(){
int i = 0;
do {
switch (btnState[i]){
case 0:
audioPlayer.writeToPlayer(fullSilenceArray);
break;
case 1:
audioPlayer.writeToPlayer(tockSound);
audioPlayer.writeToPlayer(tockSilenceArray);
break;
case 2:
audioPlayer.writeToPlayer(tickSound);
audioPlayer.writeToPlayer(tickSilenceArray);
break;
}
if(i < btnState.length - 1){
i++;
} else {
i = 0;
}
} while (play);
audioPlayer.destroyPlayer();
}
好的,所以我试图做的是每次我给播放器写信时,我希望正确的按钮闪烁,以直观地显示节拍器的节拍。我不知道如何做到这一点。我对安卓很陌生。有人请帮忙。