如何告诉 UI 线程从另一个线程为按钮设置动画?

时间:2021-01-31 22:10:16

标签: java android multithreading animation button

它是一个节拍器应用程序,但这部分基本上像鼓机一样工作。我有一个单独的线程,它在我调用 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();
    }

好的,所以我试图做的是每次我给播放器写信时,我希望正确的按钮闪烁,以直观地显示节拍器的节拍。我不知道如何做到这一点。我对安卓很陌生。有人请帮忙。

0 个答案:

没有答案