为某些 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()
),但最后还是相同的SkScan
和SkBlitter
起作用。
所有这些代码很难立即吸引我,但是引起我注意的是,如果GradientDrawable
同时具有背景和笔触(look here),那么NinePatch
就会对整个 native 堆栈进行两次调用,而在任何情况下NinePatch
只会使其中一个。
因此,在大多数情况下,我并没有实际测量两种方法的时间,但是感觉到drawRect()
赢得了竞争:如果我们[强烈地]粗略地假设drawPath()
和NinePatch
的 native 调用堆栈使用的逻辑几乎相同,并且[另一个糟糕的简化]由GradientDrawable
和NinePatch
创建并传递到那里的集合不会对方法的复杂性产生太大的影响,因此GradientDrawable
的速度比带有填充和轮廓的ojit_code快约2倍。好吧,只要您使用常规的9节 9-patch (即不要用太多标记切碎您的 9-patch ,那么遍历整个 fragment 的工作就会非常费力)。
任何会偶然发现这个问题并且对这个主题了解更多的人(和/或更好地估计 native 代码的复杂性),如果我错了,请纠正我。
PS是的,我知道这不是一个直接的答案