android - 更流畅的 Android SeekBar

标签 android audio seekbar android-seekbar

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

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

我的 SeekBars 的问题是它们听起来太有节奏,我希望它听起来更模拟(如果你愿意的话更平滑)。在我的应用程序的 iOS 实现中,原生 UISliders 做得很好,我没有听到任何类似步进的 Action 。然而,SeekBars 并不是很平滑,并且倾向于从一个值跳转到另一个值(假设从 10 到 100,最大值为 1000)。

我想知道如果我只是设计自己的自定义 UI 以实现更平滑的 slider 是否最好,或者是否已经有一个。另外,我的音频线程是否可能中断 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 秒 (1000ms) 从 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
}

(未经测试的代码)

关于android - 更流畅的 Android SeekBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39400906/

相关文章:

android - SwipeRefreshLayout -- 如何检测拖动距离?

algorithm - 确定两个频率之间的不和谐程度

c# - 使用 NAudio 替换视频的音频流

java - 使用 EditText 更新 SeekBar

android - SeekBar 和 ListView 回收问题

java - 从字符串中删除所有没有特定字符的字符?

android - ionic 运行android不在设备上运行应用程序

java - <anonymous> 不是抽象的,不会覆盖 AsyncHttpResponseHandler 中的抽象方法 onFailure(int,Header[],byte[],Throwable)

android - 在 android 中降低或淡化声音

java - 如何在 Android 上使用两个或多个搜索栏