更平滑 Android SeekBar
Smoother Android SeekBar
我并不是在严格地寻找这个想法的实现,但如果有人已经实现了,那就太棒了,我想看看。否则:
我正在尝试在我的 Android 波形发生器应用程序中实现一对 SeekBars
。我有几个控件,例如:音量、频率、低通滤波器截止频率、共振、弯音等。
我的 SeekBars
的问题是它们听起来太过分了,我希望它听起来更模拟(如果你愿意的话更平滑)。在我的 iOS 应用程序实施中,原生 UISliders
做得很好,我没有听到任何类似台阶的动作。但是,SeekBars
不是很平滑,并且倾向于从一个值跳到另一个值(比如说从 10 到 100,最大值为 1000)。
我在想,如果我只是设计自己的自定义 UI 以获得更平滑的滑块,或者是否已经有一个,这可能是最好的。另外,我的音频线程是否有可能中断 SeekBar
的功能并导致这些 jumps/step-like 行为?
我已经尝试过的事情:
低通侦听器 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。这个问题是如果我试图做一个弯音(一个 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 秒(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
}
(未经测试的代码)
我并不是在严格地寻找这个想法的实现,但如果有人已经实现了,那就太棒了,我想看看。否则:
我正在尝试在我的 Android 波形发生器应用程序中实现一对 SeekBars
。我有几个控件,例如:音量、频率、低通滤波器截止频率、共振、弯音等。
我的 SeekBars
的问题是它们听起来太过分了,我希望它听起来更模拟(如果你愿意的话更平滑)。在我的 iOS 应用程序实施中,原生 UISliders
做得很好,我没有听到任何类似台阶的动作。但是,SeekBars
不是很平滑,并且倾向于从一个值跳到另一个值(比如说从 10 到 100,最大值为 1000)。
我在想,如果我只是设计自己的自定义 UI 以获得更平滑的滑块,或者是否已经有一个,这可能是最好的。另外,我的音频线程是否有可能中断 SeekBar
的功能并导致这些 jumps/step-like 行为?
我已经尝试过的事情:
低通侦听器
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。这个问题是如果我试图做一个弯音(一个 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 秒(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
}
(未经测试的代码)