2016-09-08 9 views
2

나는이 아이디어의 구현을 엄격하게 찾고 있지는 않지만 누군가가 이미 그것을 만든 경우, 그것은 멋지고 나는 그것을보고 싶습니다. 그렇지 않은 경우 :더 부드럽게 안드로이드 SeekBar

Android의 파형 생성기 앱에 SeekBars 두 개를 구현하려고합니다. 나는 볼륨, 주파수, 로우 패스 필터 컷오프 주파수, 공진, 피치 벤드 등과 같은 몇 가지 컨트롤을 가지고있다.

SeekBars의 문제점은 소리가 너무 발달하여 더 아날로그적인 소리를 내고 싶다는 것이다. -ish (원한다면 더 부드럽게). 앱을 iOS로 구현할 때, 네이티브 인 UISliders은 좋은 일을했고 나는 계단 모양의 움직임을 듣지 못했습니다. 그러나 SeekBars은 부드럽지 않고 값을 값으로 이동하는 경향이 있습니다 (최대 값 1000 인 경우 10에서 100까지와 같이 말하십시오).

부드럽게 슬라이더를 만들거나 이미있는 경우 사용자 지정 UI를 디자인하는 것이 가장 좋은 것인지 궁금합니다. 또한, 내 오디오 스레드가 SeekBar의 기능을 방해하고 이러한 점프/단계와 유사한 동작을 일으킬 가능성이 있습니까?

것 이미 시도했다 :

  • 로우 패스 청취자의 onProgressChanged에서 SeekBar를 진행합니다. 이것은 실제로 작동하지 않습니다 (예를 들어 5에서 100으로 뛰었을 때,이 값은 중간에 값을 주지만, 여전히 부드럽고 부드럽게 움직이지는 않습니다). 거대한 점프 (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; 
    } 
    
  • , 나는 피치 벤드을하려고 한 경우이 가진 문제가 1 씩 오디오 문맥의 변수를 증가 while 루프를 부를 것이다 (총 16384 값이되도록 14 비트 숫자), 목표 값에 도달하는 데 너무 오래 걸립니다 (피치 벤드는 쿨하게 들립니다). 예를 들어 (진행 올라가고에 대한 분명이 계정 만) :

    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 초 (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 
} 

(테스트되지 않은 코드)

+0

은'청취자의'startTrackingTouch' 통화에서 설정할 수 startTime'시겠습니까? 나는 이것을 곧 풀어 볼 것입니다 ... –

+0

예, startTime은 변경이 일어난 순간입니다. – Mick

+0

좋은 제안이지만 startTime에서 밀리 초 범위가 너무 작아서 (일반적으로 1 차이 만) 정확히 계산할 수 없습니다 . 어떤 아이디어? 속도 테이퍼 만 변경해야합니까? –