2013-10-22 18 views
0

我有一個包含用戶的繪圖視圖。當點擊「播放」按鈕時,我想要一個從開始到結束繪製圖像的循環。Android的 - 觸發一個循環,在聽衆多次重繪(力無效即使UI線程繁忙)

在試圖做到這一點我基本都播放按鈕,基本上無效的觀點,等待一個onClickListener的內部循環,將下一個點的集合,並再次無效。

的問題是圖像實際上並不重繪,直到之後的整個圖像繪製。所以基本上什麼都沒有發生,然後突然完成。之後做一些研究,我的假設是無效說的是主UI線程重繪時,得到的時間,但它已經掛了對付監聽器,所以它實際上並沒有畫,直到循環結束。我試過直接調用onDraw,使用postInvalidate,以及其他我可以想到的荒謬的事情,但我不知道如何讓這個工作。

下面是一些代碼片段:

在我PaintActivity(其中有一個PaintAreaView) 洗滌器指示繪製的進度。當我手動使用搜索欄時,onProgressChanged中的第一行可用,但在按下play時不起作用,這就是爲什麼我嘗試添加所有額外內容的原因。

 _scrubber.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
      _paintAreaView.setPointsToDraw(_scrubber.getProgress()); 
      _paintAreaView.invalidate(); 
      _mainViewGroup.invalidate(); 
      _paintAreaView.postInvalidate(); 
      _mainViewGroup.postInvalidate(); 
      _paintAreaView.drawPoints(_paintAreaView.getCanvas()); 
      _paintAreaView.invalidate(); 
     }... 

我的播放按鈕的東西:

 play.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ... 
      playDrawing(); 
      ... 
     } 
    }); 

    private void playDrawing() 
{ 
    int endPoint = getPaintPointCount(); 

    while(_scrubber.getProgress() < endPoint) 
    { 
     _scrubber.incrementProgressBy(1); 

     try{ 
      Thread.sleep(10); 
     }catch(InterruptedException e) 
     { 
      Thread.currentThread().interrupt(); 
     } 
     //_paintAreaView.setPointsToDraw(_scrubber.getProgress()); 
     //_paintAreaView.invalidate(); 
     //_mainViewGroup.invalidate(); 
     if(_isPaused) 
      break; 
    } 
} 

我不使用的睡眠一個巨大的風扇,但我已經與其他解決方案掙扎,這就是我接下來要做的研究。但對於這個問題,增加進度條沒有成功調用onProgressChanged,但同樣它只是不繪製視圖,直到它的是播放鍵點擊監聽器的。

如果我不得不等待,直到我離開聽衆才能使其工作,我已經足夠新了,我不知道我會如何處理這個問題。

對不起,我糟糕的代碼,任何的幫助深表感謝幫助我瞭解這裏發生了什麼,我需要了解得到這個工作是什麼。

謝謝!

回答

0

我得到它的工作,我不知道如果我所做的一切都是必要的,但這裏是基於我的主UI線程理論成爲問題所做的更改。

我創建了一個Thread類的成員變量:

private Thread _drawThread; 

在的onCreate():

_drawThread = new Thread(){ 
    public void run(){ 
     playDrawing(); 
    } 
}; 

播放按鈕的onClick:

play.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     ... 
     _drawThread.start(); 
    } 
}); 

似乎是在做我想要的東西, !除了應用程序崩潰,我第二次玩遊戲:)從這裏我不認爲這將是不好的解決這個問題,雖然。

編輯----- 在我的播放按鈕onClickListener創建線程,而不是它是一個成員變量修復了崩潰。我錯誤地認爲一旦監聽器超出了主線程的範圍,線程就會被銷燬,但我想不是這種情況。