2010-03-21 143 views
3

我正在寫一個直接繪製到視圖的onDraw事件上的畫布的android應用程序。繪製到畫布

我畫的東西,包括單獨繪製每個像素,爲了這個,我使用類似:

for (int x = 0; x < xMax; x++) { 
    for (int y = 0; y < yMax; y++){ 
    MyColour = CalculateMyPoint(x, y); 
    canvas.drawPoint(x, y, MyColour); 
    } 
} 

這裏的問題是,這需要很長的時間來畫的CalculateMyPoint程序是相當昂貴的方法。

是否有更高效的繪畫方式,例如我應該繪製位圖,然後將整個位圖繪製到onDraw事件的畫布上?或者,也許評估我的顏色,並填寫onDraw方法可用於繪製畫布的數組?

我的應用程序的用戶將能夠更改影響畫布上繪圖的參數。這在目前非常緩慢。

+0

什麼使CalculateMyPoint需要很長時間才能處理? – Adam 2010-03-21 14:03:43

+0

我有一個合理的計算來計算任何給定像素的顏色。我只是想知道是否最好計算每個像素的顏色而不是視圖的onDraw事件。 – Mattl 2010-03-21 17:30:30

+0

您是否必須單獨繪製每個像素?因爲Droid或nexus上的像素超過40萬像素,我覺得有更多機會優化CalculateMyPoint的調用次數而不是運行時。 – jqpubliq 2010-03-21 17:54:11

回答

5

正如人們已經指出的那樣,如果CalculateMyPixel()價格昂貴,那麼稱爲150,000(HVGA)或384,00倍(WVGA)就是要殺死你。

最重要的是,每次有更新時都試圖通過canvas.drawPoint()將您的用戶界面作爲單個像素繪製,而這只是最低效的方式。

如果你正在繪製單獨的像素,你幾乎肯定會想要一些包含像素的離屏位圖,你可以用一個簡單的Canvas.drawBitmap()來繪製。

然後,您可以決定管理該位圖的最佳方法。最簡單的方法是創建一個所需大小的位圖對象並使用其中的API來填充它。

或者,還有一個drawBitmap()的版本需要原始整數數組,因此您可以將其填充直接與你想要的任何值,避免每個像素的方法調用。

現在,您可以將像素計算移出onDraw()方法,該方法需要快速以獲得響應式UI,並將像素填充到其他位置。也許你在初始化時計算一次。也許你計算它們,並且在調用invalidate()之前僅對已經改變的部分進行選擇性更新(例如(0,0) - (10,l0)中的像素已經改變,因此取出當前位圖並修改該區域)。如果計算像素真的很慢,那麼您可能需要創建一個單獨的線程來執行此操作(使用新像素更新位圖,然後在UI上使用postInvalidate()來繪製它們)。

此外,現在您的像素位於一個位圖中,您可以執行一些技巧,比如縮小位圖的大小並在繪製到屏幕時對其進行縮放,從而使您在更新這些像素時花費更少的時間,整個用戶界面(雖然分辨率較低)。

+0

謝謝,我想這是所有常識。
目前大約需要1分鐘時間,我的OnDraw例程中用代碼初始化應用程序,超過1秒的任何內容都可能無法接受。
此調用初始化我的位圖的像素陣列我需要:
公共靜態位圖createBitmap(INT []的色彩,詮釋寬度,高度INT,Bitmap.Config配置)
這也是事實,我真的不需要WVGA分辨率,所以我會嘗試縮放。
Mattl 2010-03-22 12:06:44

+0

我在這個晚上度過了這些提示,並將我的渲染從一分鐘縮短到了3秒!我想我可以通過進一步優化來削減另一秒。再次感謝hackbod。 – Mattl 2010-03-23 10:34:07

+1

你能舉出一個改進代碼的例子嗎? – 2010-07-01 07:57:41