为某些 View 设置背景的最佳方法是什么?例如backround的2个变体:

带有渐变,圆角和边框的

  • 背景
  • 仅有一种颜色和圆角的
  • 背景

  • 那么, 9-patch 或可绘制的xml资源哪个更好?

    最佳答案

    我的猜测是,多数情况下NinePatch会稍微快一些。这是我发现的。
    GradientDrawable(用于xml中的rects的代码)使用this code来调用Canvas,后者再使用 native 调用导致 SkCanvas SkDraw 以及最终 SkScan SkBlitter

    另一方面,在本地 NinePatch 's draw() has almost zero Java code之前的call to NinePatch.cpp shortly calls NinePatchImpl.cpp -- NinePatch_draw() ---这就是魔术所在。那里的代码在标记的区域上进行迭代,并且在随后的许多调用中,使用SkDraw中的大致相同的逻辑绘制东西(仅使用drawRect()而不是drawPath()),但最后还是相同的SkScanSkBlitter起作用。

    所有这些代码很难立即吸引我,但是引起我注意的是,如果GradientDrawable同时具有背景和笔触(look here),那么NinePatch就会对整个 native 堆栈进行两次调用,而在任何情况下NinePatch只会使其中一个。

    因此,在大多数情况下,我并没有实际测量两种方法的时间,但是感觉到drawRect()赢得了竞争:如果我们[强烈地]粗略地假设drawPath()NinePatch的 native 调用堆栈使用的逻辑几乎相同,并且[另一个糟糕的简化]由GradientDrawableNinePatch创建并传递到那里的集合不会对方法的复杂性产生太大的影响,因此GradientDrawable的速度比带有填充和轮廓的ojit_code快约2倍。好吧,只要您使用常规的9节 9-patch (即不要用太多标记切碎您的 9-patch ,那么遍历整个 fragment 的工作就会非常费力)。

    任何会偶然发现这个问题并且对这个主题了解更多的人(和/或更好地估计 native 代码的复杂性),如果我错了,请纠正我。

    PS是的,我知道这不是一个直接的答案

    09-30 09:42