Canvas.getClipBounds是否分配Rect对象?

时间:2012-04-05 22:05:32

标签: android optimization android-canvas android-custom-view

在我的自定义视图中,我正在研究使用Canvas.getClipBounds()来优化我的onDraw方法(这样我每次调用时都只绘制了绝对必要的内容)。

但是,我仍然希望绝对避免任何对象创建...

我的问题是:getClipBounds()每次调用时都会分配一个新的Rect吗?或者只是简单地回收一个Rect?

如果它正在分配一个新对象,我可以使用getClipBounds(Rect bounds)来保存这笔费用,{{3}}似乎使用传递的Rect而不是它自己的吗?


(在您尖叫过早优化之前,请考虑放置在ScrollView中时,onDraw可以每秒调用多次次)

2 个答案:

答案 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()"的实际方法声明是这个

  1. public boolean getClipBounds(Rect bounds) 所以每次打电话都不会创建一个新的Rect。它将使用您的Rect对象 将作为参数传递给此函数。 我建议看看这个 enter link description here