Android:计数器达到整数时播放声音(仅限上传)

时间:2015-10-10 00:53:35

标签: android android-mediaplayer

我在我的应用中面临的新问题,这不是一个错误,而是一个我遇到问题的挑战。

所以在我的应用程序中,当检测到一定程度的声音时,计数器(在TextView中显示)开始计数。有一些层级(基于DragonBall Z功率级别),例如1到300'000,然后是300'001到30'000'000,最后是30'000'001到15'000'000。当不再检测到声音时,功率水平会慢慢下降。

我有一个声音文件,我需要在达到每个层时播放。因此,一旦计数器启动,声音文件应该播放一次。然后当达到第二层(300'000)时,它再次播放。

我的条件是,文件只应在功率级别上升时播放,因此从299'999到300'000会播放。但如果功率水平从300'001下降到300'000,那么声音就不应该播放。此外,由于要达到的数量很大,计数器不会增加1,而是根据层级数量会增加很多。

例如,从300'000到30'000'000一次计数1将需要永远。除非我非常快地计算这个很好,但我不确定这是否可行。所以在那个例子中,我目前每隔100毫秒计算一次312'345(测试的随机数)(每秒3'123'450)。

所以我不能简单地说......

  

if(currentPowerlevel == 300000){mSounds.play(etc)}

由于计数增量,可能会跳过此确切数字。所以我尝试使用......

  

if(currentPowerlevel> 300000&& currentPowerlevel< 612344){mSounds.play(etc)}

希望这意味着文件只会播放一次,即使在计数器上准确达到300'000,下一个计数将是612'345,因为该层的增量金额。但是这不仅是混乱的,而且如果对层/计数速度进行更改,则需要进行大量麻烦的代码更改,但它似乎仍然无法正常工作并重复播放文件。

所以我会在下面发布所有相关代码,希望有人能克服这个挑战!理想情况下,我希望以下内容成立:

  • 计数器每计数增加1,速度可调,占3,000,000到15'000'000等大层。
  • 声音文件只能在向上计数时播放,但在向下时不能播放。
  • 有一种冷却时间,或每10秒最大允许播放声音,以阻止文件重复播放。

    public void countPowerLevel(){

    // Goku Start
    if (currentAmplitude > 9000 && currentPowerLevel <= 299999) {
        currentPowerLevel = (currentPowerLevel) + 3123;
    } else if (currentAmplitude <= 8999 && currentPowerLevel <= 299999) {
        currentPowerLevel = (currentPowerLevel) - 312;
    }
    
    // Goku Kaioken (300'000)
    if (currentAmplitude > 9000 && currentPowerLevel >= 300000) {
        currentPowerLevel = (currentPowerLevel) + 312345;
    } else if (currentAmplitude <= 8999 && currentPowerLevel >= 300000 && currentPowerLevel <= 29999999){
        currentPowerLevel = (currentPowerLevel) - 31234;
    }
    
    
    // Goku Kaioken x 10 (30'000'000)
    if (currentAmplitude > 9000 && currentPowerLevel >= 30000000) {
        currentPowerLevel = (currentPowerLevel) + 1512345;
    } else if (currentAmplitude <= 8999 && currentPowerLevel >= 30000000 && currentPowerLevel <= 149999999) {
        currentPowerLevel = (currentPowerLevel) - 151234;
    }
    
    // Goku Super Saiyan 1 (150'000'000)
    if (currentAmplitude > 9000 && currentPowerLevel >= 150000000) {
        currentPowerLevel = (currentPowerLevel) + 8012345;
    } else if (currentAmplitude <= 8999 && currentPowerLevel >= 150000000 && currentPowerLevel <= 799999999) {
        currentPowerLevel = (currentPowerLevel) - 801234;
    }
    
    if (currentPowerLevel > 800000000) {
        currentPowerLevel = (currentPowerLevel) - 801234;
    }
    
    // Stop power from going below 1
    if (currentPowerLevel < 1) {
        currentPowerLevel = 1;
    }
    
    // Alerts for reaching power level milestones
    TextView textCurrentForm = (TextView) findViewById(R.id.textCurrentForm);
    ImageView imgCurrentForm = (ImageView) findViewById(R.id.imgCurrentForm);
    imgCurrentForm.setImageResource(R.drawable.goku);
    
    // Goku Kaioken (300'000)
    if (currentPowerLevel >= 300000) {
        textCurrentForm.setText("Kaioken!");
        imgCurrentForm.setImageResource(R.drawable.gokukk10);
    }
    
    // Goku Kaioken x 10 (30'000'000)
    if (currentPowerLevel >= 30000000) {
        textCurrentForm.setText("Kaioken x 10!");
        imgCurrentForm.setImageResource(R.drawable.gokukk100);
    }
    
    // Goku Super Saiyan 1 (150'000'000)
    if (currentPowerLevel >= 150000000) {
        textCurrentForm.setText("Super Saiyan!");
        imgCurrentForm.setImageResource(R.drawable.gokussj);
    }
    
    // Trigger sounds per power level
    if (currentPowerLevel > 1 && currentPowerLevel < 4000) {
        mSounds.play(sndAura01, 1, 1, 1, 0, 1);
    }
    
    if (currentPowerLevel > 4000 && currentPowerLevel < 10000) {
        mSounds.stop(sndAura01);
    }
    
    if (currentPowerLevel == 300000) {
        mSounds.play(sndAura01, 1, 1, 1, 0, 1);
    }
    

    }

更新:

好的,我想出了我认为应该有用的东西,但由于某种原因,它不起作用......

// Trigger sounds per power level

// Count amount of times sound has been played
int soundPlayed = 0;

if (currentPowerLevel > 1 && currentPowerLevel <= 299999) {
    if (soundPlayed == 0) {
        mSounds.play(sndAura01, 1, 1, 1, 0, 1);
        soundPlayed = 1;
    }
}

if (currentPowerLevel > 300000 && currentPowerLevel <= 2999999) {
    if (soundPlayed == 1) {
        mSounds.play(sndAura01, 1, 1, 1, 0, 1);
        soundPlayed = 2;
    }
}

有什么想法吗?

更新2:

我弄清楚为什么上面的代码不起作用,整个块在处理程序中循环。因此,在soundPlayed整数设置为1之后立即再次将其设置为0。现在正在解决这个问题......

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了。

我做的是在课程开始时首先设置一个整数变量“soundPlayed”:

// Count amount of times sound has been played
int soundPlayed = 0;

然后我改变了我的声音触发器如下:

if (currentPowerLevel > 1 && currentPowerLevel <= 299999) {
    if (soundPlayed == 0) {
        mSounds.play(sndAura01, 1, 1, 1, 0, 1);
        soundPlayed = 1;
    }
}

if (currentPowerLevel > 300000 && currentPowerLevel <= 2999999) {
    if (soundPlayed == 1) {
        mSounds.play(sndAura01, 1, 1, 1, 0, 1);
        soundPlayed = 2;
    }
}

声音播放从0开始。当功率电平在1到299'999之间时,并且soundPlayed等于0,声音将被播放,变量soundPlayed现在将被设置为1.此代码每次触发100毫秒(每秒10次),因为它是我的Runnable Handler的一部分。在循环的第二次和每次其他迭代中,它将检查soundPlayed是否为0,它不是(因为它现在为1)并且不会再次播放音频文件。

然后一旦达到300'000,它现在将检查soundPlayed是否等于1,它是。它再次播放声音文件,现在将soundPlayed设置为2.

我可以将它设置为0,但这意味着如果功率水平下降(下降)回到299'999或更低,声音会再次播放,这是我不想要的。

希望这可以帮助其他任何需要达到类似效果的人!