2013-01-07 138 views
0

請原諒模糊的問題,但我是新來的android和java和和我讀過的關於此主題的所有東西只提供xml代碼示例,這是沒有用的因爲我正在以編程方式做所有事情。安卓繪圖覆蓋在異步任務線程視圖

所以我有一個應用程序,繪製音樂符號,然後隨着音樂播放,我需要覆蓋某種光標(矩形框確定)在當前正在播放的音符,卡拉OK風格。

我創建這樣

Globals.mMainView = new MainView(context); 
      Globals.mMainView.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 60)); 
      layout.addView(Globals.mMainView); 

我保存在一個全局視圖參考視圖,以便以後可以找到它,(是的,我知道了Java警方將在這一點上來找我,但我可以稍後找到更優雅的解決方案)。請注意,我的視圖處於線性佈局,因爲我旁邊有另一個不相關的視圖。

在主線程中繪製onDraw可以很好地呈現樂譜。

所以,當我打我的播放按鈕,我開始對這些

class Play1Activity extends AsyncTask<String, Integer, Boolean> 

之一,併發揮doInBackground音頻和定期調用publishProgress與播放位置這反過來導致onProgressUpdate在UI線程中運行,其中i現在我想在主視圖(我有一個引用Globals.mMainView)上繪製一些東西,而不必重畫整個視圖來保存CPU並使動畫看起來不錯。在窗口中,我可以繪製一個帶有XOR標誌的矩形,它反轉了我感興趣的分數部分,然後再次執行相同的操作以解除它,然後繪製到下一個位置。

在這一點上,我對android毫無頭緒。也許有人可能會建議我遵循的最佳途徑。謝謝

回答

0

如果您知道哪個部分的主視圖應該重繪,您可以在視圖上調用invalidate (Rect dirty)invalidate (int l, int t, int r, int b)。在這種情況下,唯一的髒區域將被重新繪製。

+0

這很有趣,所以我把Globals.mMainView.invalidate(40,40,200,200);在onProgressUpdate,它會導致系統調用OnDraw,但現在呢? onDraw如何知道在哪裏重繪? – steveh

+0

我試圖通過進度更新調用onDraw時沒有做任何事情,但我只是得到一個空白的視圖。我想我不清楚是什麼叫參數無效與參數。 – steveh

+0

我不確定它是如何工作的,但我認爲這種方式。你調用'invalidate(Rect dirty)',它會導致系統重新繪製視圖。在你的'onDraw()'方法中,你只需要做平常的繪製(在你的案例中繪製一個覆蓋圖)。就這樣。訣竅在於,傳遞給'onDraw'方法的'canvas'對象被修剪爲骯髒的矩形。這就是爲什麼只有位於矩形內的點才重新繪製。 –