2012-01-01 53 views
1

我有一個相對的佈局與幾個ImageViews(與透明領域)在彼此之上。問題是:如果我使其中一個失效,則所有其他的onDraw()方法也會被調用。這是正常的嗎? 我不希望所有圖層(視圖)重新繪製,因爲這是一個很大的性能問題 - 我只想要無效視圖重繪..Android:我如何繞過無效/重繪未受影響的層?

任何想法?

回答

1

這是正常的嗎?

是的。

,因爲這是一個很大的性能問題

使用Traceview來驗證你的性能瓶頸所在。或者可能真的使用layers。或者,如果您正在創建遊戲或其他東西,請不要使用窗口小部件框架,而應直接使用Canvas(或使用OpenGL)。

+0

對不起,只是爲了確保:你在說,例如,如果我在一個佈局/視圖中有一個動畫按鈕,與圖形佈局/視圖(在onDraw()中繪製)重疊,並且我按下該按鈕(它動畫...),則整個底層圖形必須再次繪製?聽起來很奇怪 - 爲什麼每個視圖都有一個無效的方法呢? ... – stoefln 2012-01-01 22:46:56

+0

@stoefln:「整個底層圖形必須再次繪製?」 - 重繪的範圍將是Android認爲可能需要重新繪製的任何東西,並且Android傾向於認爲可能需要重繪的東西可能是您自己可能不會這麼想的。 – CommonsWare 2012-01-01 22:59:16

+0

「使用Traceview識別性能瓶頸所在。」 - >瓶頸是路徑的繪製。我無法讓這個速度更快,我只需要緩存視圖的可能性,因爲它只需要繪製一次(讓我們來說說應用何時啓動)。 「或者,可能確實會使用圖層。」 - >這不支持android 2.1 「...而是直接畫到畫布」 - >這就是我所做的。我在視圖的onDraw()中繪製畫布,但正如我所說的,這需要一些處理,每次重新繪製另一個視圖上的某個組件時,我都負擔不起。 – stoefln 2012-01-01 23:33:37

2

假設您在View上使用invalidate(),也許您可​​以嘗試使用其中一個other?理論上這隻會重繪受影響的(骯髒的)區域。

void invalidate(Rect dirty) 
void invalidate(int l, int t, int r, int b) 
void invalidateDrawable(Drawable drawable) 

另請參閱this視頻(約34:07馬克)。他們有一個很好的小演示,詳細描述了這一點。

+0

好視頻 - 謝謝! – stoefln 2012-01-02 20:56:16