我并不是严格地寻找这个想法的实现,但如果有人已经做到了,那就太棒了,我希望看到它。否则:
我正在尝试在我的 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/