2016-09-08 66 views
2

我並不嚴格尋求這個想法的實現,但如果有人已經做到了,那將是非常棒的,我希望看到它。否則:更平滑的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。這樣做的問題是,如果我試圖做一個彎音遞增音頻上下文的變量(一個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

首先,找出你希望音量增加的最快速度。在這個例子中,我將使用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 
} 

(未測試的代碼)

+0

會'startTime'可以在聽者'startTrackingTouch'呼叫建立?我會很快嘗試... –

+0

是的,startTime是發生變化的時刻 – Mick

+0

好的建議,但結果是從startTime的毫秒跨度太小(通常只有1的差異)​​並且無法正確計算它。有任何想法嗎?我應該改變速度錐度嗎? –