在我的自定义视图中,我正在研究使用Canvas.getClipBounds()来优化我的onDraw方法(这样我每次调用时都只绘制了绝对必要的内容)。
但是,我仍然希望绝对避免任何对象创建...
我的问题是:getClipBounds()
每次调用时都会分配一个新的Rect吗?或者只是简单地回收一个Rect?
如果它正在分配一个新对象,我可以使用getClipBounds(Rect bounds)
来保存这笔费用,{{3}}似乎使用传递的Rect而不是它自己的吗?
(在您尖叫过早优化之前,请考虑放置在ScrollView中时,onDraw可以每秒调用多次次)
答案 0 :(得分:9)
我已经查看了Android 4.0.1中Canvas的源代码,它如下:
/**
* 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()对象。
答案 1 :(得分:0)
" getClipBounds()"的实际方法声明是这个