2012-06-29 59 views
0

我所擁有的是一個由按鈕控制的seekbar,而不是使用set/get progress的滑塊。開啓關鍵循環,直到關閉爲止

我試圖讓seekbar的進度增加,當用戶按下一個按鈕,然後停止增加,當他們離開按鈕。我有一個onkey監聽器,可以上下查看。我只是不知道把setprogress部分放在哪裏,如果我把一個循環放在ACTION_DOWN上,那麼它循環而不是檢測ACTION_UP,如果我有一個ACTION_DOWN的while循環似乎會發生。

我想我可能也必須設置refreshDraweableState,但我沒有太多看看。

潛在我試圖攪拌seekbars太多,但我會很感激任何幫助/建議。謝謝!

這是我的keylistner,這是我大部分時間都在搞的。

public boolean onKey(View view, int keyCode, KeyEvent event) { 
    builder.setLength(0); 
    switch (event.getAction()){ 
     case KeyEvent.ACTION_DOWN: 
      builder.append(event.getKeyCode()); 
      String text = builder.toString(); 
      Log.w("seekbar", text); 
      textView.setText(text); 
      while (sk.getProgress() < 100){ 
       sk.setProgress(sk.getProgress()+1); 
       sk.refreshDrawableState(); 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        break; 
       } 
      } 
      break; 
     case KeyEvent.ACTION_UP: 
      break; 
    } 
    return true; 
} 

}

回答

0

你需要能夠停止在ACTION_DOWN甚至while循環,否則只會繼續下去,直到它達到99

而且while循環阻塞UI線程所以我會把它放在一個新的線程中(不知道如何在普通的Android上做到這一點,我使用Mono for Android),並且在發生ACTION_UP事件時停止該線程,或者在斷開它的while循環中放入另一個檢查。

單聲道的Android會有所做過這樣的:

public bool OnKey(View view, int keyCode, KeyEvent e) 
{ 
    switch(e.Action) 
    { 
     case KeyEventAction.Down: 
      Start(); 
     break; 
     case KeyEventAction.Up: 
      Stop(); 
     break; 
    } 
} 

private volatile bool _shouldStop; 

public void IncreaseProgress() 
{ 
    while (!_shouldStop && sk.Progress < 100) 
    { 
     //Working 
     RunOnUiThread(() => { 
      sk.Progress = sk.Progress+1; 
      sk.RefreshDrawableState(); 
     }); 
     Thread.Sleep(50); 
    } 
    //Terminating 
} 

public void Start() 
{ 
    _shouldStop = false; 
    Thread workerThread = new Thread(IncreaseProgress); 
    workerThread.Start(); 
} 

public void Stop() 
{ 
    _shouldStop = true; 
    workerThread.Stop(); 
}