2012-04-05 48 views
3

在我的自定義視圖中,我正在研究使用Canvas.getClipBounds()來優化我的onDraw方法(以便我只繪製每次調用時絕對必要的)。Canvas.getClipBounds是否分配Rect對象?

不過,我還是要絕對避免任何對象創建...

我的問題,因此是:不getClipBounds()每次調用時分配一個新的矩形?或者它只是回收單個Rect?

如果它正在分配一個新的對象,我可以通過使用getClipBounds(Rect bounds)來節省這筆費用,它似乎使用傳遞的Rect而不是它自己的?


(你尖叫過早的優化之前,不要考慮放置在滾動型時,的onDraw可以稱爲許多次每秒)

回答

7

我已經看過成畫布源代碼,由於Android 4.0.1的,並且其計算方法如下:

/** 
* Retrieve the clip bounds, returning true if they are non-empty. 
* 
* @param bounds Return the clip bounds here. If it is null, ignore it but 
*    still return true if the current clip is non-empty. 
* @return true if the current clip is non-empty. 
*/ 
public boolean getClipBounds(Rect bounds) { 
    return native_getClipBounds(mNativeCanvas, bounds); 
} 


/** 
* Retrieve the clip bounds. 
* 
* @return the clip bounds, or [0, 0, 0, 0] if the clip is empty. 
*/ 
public final Rect getClipBounds() { 
    Rect r = new Rect(); 
    getClipBounds(r); 
    return r; 
} 

所以,回答你的問題,getClipBounds(Rect bounds)將使您免於創建一個對象,但getClipBounds()實際上每次調用時都會創建一個新的Rect()對象。

0

的實際方法聲明「getClipBounds()」是這樣的

  1. public boolean getClipBounds(Rect bounds) 所以它不會在您每次打電話時創建一個新的Rect。它將使用您將 作爲參數傳遞給此函數的Rect對象。 我建議看看這個 enter link description here
+0

什麼?我不明白。正如我在我的問題中寫的,有兩種不同的方法調用。一個確實採取了Rect,一個沒有。我在問那個沒有的人。 – yydl 2012-04-05 22:26:06

+0

不便之處,但爲了避免每次調用方法時創建Rect對象,您應該像Luis所說的那樣使用此方法getClipBounds(Rect bounds)。 – appdroid 2012-04-05 22:36:46

相關問題