2012-05-31 32 views
0

我对Android开发仍然陌生并陷入困境。我有一个onTouchEvent,它为旋转图形提供动力,并增加背景int [counter],触发短暂的声音效果(嘟嘟声)进行播放。目前,如果[counter]> 10 a声音播放(使用soundpool),并且只要onTouchEvent保持计数器大于10,就会立即循环播放。是否可以在嘟嘟声效果播放之间插入延迟,以便延迟减少[counter]的值越大?需要帮助在音效回放之间插入延迟

实施例: 如果(计数器== 10){延迟= 80 //在MS} 如果(计数器== 90){延迟= 10 //在MS}

我的代码:

sm = new SoundManager(); 
    sm.initSounds(getBaseContext()); 
    sm.addSound(1, R.raw.beep); 

... 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (buttonClicked) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      counter++; 
      startRotating(); 
      break; 
     case MotionEvent.ACTION_UP: 
      counter--; 
      stopRotating(); 
      break; 
     } 
    } 

    return super.onTouchEvent(event); 
} 

public void startRotating() { 
    returnRotating = false; 

    if (!keepRotating) { 
     keepRotating = true; 

     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if (keepRotating) { 
        degrees = (degrees + 10) % 360; 
        make(degrees); 
        counter = counter + 1; 

        if (counter > 10) 
         sm.playSound(1); // plays beep 

        handler.postDelayed(this, INTERVAL); 
       } 
      } 
     }, INTERVAL); 
    } 
} 

编辑:添加代码

public void stopRotating() { 
    keepRotating = false; 

    if (!returnRotating) { 
     returnRotating = true; 

     final Handler handler = new Handler(); 

     handler.postDelayed(new Runnable() { 

      @Override 
      public void run() { 

       if (returnRotating) { 
        degrees = (degrees - 10) % 360; 
        make(degrees); 
        counter = counter - 1; 

        if (counter > 10) { 
        sm.playSound(1); // plays beep 

        handler.postDelayed(this, INTERVAL); 
       } 
      } 
     }, INTERVAL); 
    } 
} 

回答

0

怎么这样呢?

if (counter > 10) { 
     sm.playSound(1); // plays beep 
     INTERVAL = 100 - counter; 
     handler.postDelayed(this, INTERVAL); 
+0

这太简单了,太棒了。我会尝试一下并更新。 – n00bdev

+0

实际上,调整INTERVAL会导致旋转的流体运动变得波涛汹涌,所以这似乎不是一个好的解决方案。 – n00bdev

+0

这很奇怪。所有你正在做的是改变延迟,然后再次启动声音处理程序。如果间隔为500ms或200ms,则操作系统无额外开销。如果你的环路很紧,这只会成为一个问题。你在其他地方使用INTERVAL吗?尝试把时间放在一些log.D调用? – Simon