更顺畅的Android SeekBar

时间:2016-09-08 22:07:17

标签: android audio seekbar android-seekbar

我并不是在严格地寻找这个想法的实现,但是如果有人已经做到了,那就太棒了,我希望看到它。否则:

我正在尝试在Android的波形生成器应用中实现一对SeekBars。我有几个控件,如:音量,频率,低通滤波器截止频率,共振,弯音等。

我的SeekBars的问题在于它们听起来太有步了,我希望它听起来更模拟(如果你愿意,它会更流畅)。在我的应用程序的iOS实现中,原生UISliders做得很好,我没有听到任何类似步骤的动作。但是,SeekBars不是很平滑,并且倾向于将值跳转到值(例如,从10到100,最大值为1000)。

我想知道如果我只是设计我自己的自定义用户界面以获得更平滑的滑块或者是否已有滑块,我是否最好。另外,我的音频线程是否可能会中断SeekBar的功能并导致这些跳转/步骤式行为?

我已经尝试过的事情:

  • 在听众的onProgressChanged中低通搜索栏进度。这实际上并不起作用(例如,如果它从5跳到100,这会给我一个值,但仍然没有给出完全平滑的行为)。

    // b = 0.99, a = 0.01
    // Follows simple lowpass: yn = (xn * b) + (yn1 * a)
    public double lowpass(int xn) {
         double yn = (xn * b) + (lastProgress * a);
         lastProgress = yn;
         return yn;
    }
    
  • 如果有一个巨大的跳跃(如5到100),我会调用while循环来将音频上下文的变量增加1.问题是如果我试图做弯音(a 14位数,总共16384个值,达到目标值需要太长时间(尽管弯音听起来很酷)。例如(显然这仅仅说明了进展):

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
         int myProgress = seekBar.getProgress();
         while (myProgress < progress) {
              // This will increase the audio context's frequency variable by one every loop until we've reached our target progress
              audioContext.setFrequency(myProgress++);
         }
    }
    

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,弄清楚你希望音量增加的最快速度。对于这个例子,我将使用1秒(1000毫秒)从0更改为1.0。 (0%至100%)

进入循环时,记录当前时间。然后,对于循环的每次迭代,检查通过的时间并增加必要的量。

// example, myLoop(0.25, 0.75, startTime);
double myLoop(double start, double end, long startTime) {
    long now = System.currentTimeMillis(); // (100ms since startTime)
    double span = end - start; // the span in value, 0 to 1.0 (=0.5)

    double timeSpan = (now - startTime) / (span * 1000); // time since started / total time of change (100/500 = 0.2)

    return timeSpan * span + start; // (0.2 * 0.5 = 0.1) + 0.25 = 0.35, the value for this loop
}

(未经测试的代码)