4

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

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

因此,我的问题是:getClipBounds()每次调用时是否分配一个新的 Rect ?还是只是简单地回收一个 Rect?

如果它正在分配一个新对象,我可以通过 using 来节省这笔费用getClipBounds(Rect bounds),它似乎使用传递的 Rect 而不是它自己的?


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

4

2 回答 2

10

从 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() 对象。

于 2012-04-05T22:27:52.560 回答
0

“getClipBounds()”的实际方法声明是这样的

  1. public boolean getClipBounds (Rect bounds) 所以它不会在你每次调用时创建一个新的 Rect。它将使用您将作为参数传递给此函数的 Rect 对象。我建议在 此处查看此输入链接描述
于 2012-04-05T22:16:57.027 回答