什么是为视图设置背景的最佳方法?例如,两种不同的背景样式:
1.渐变、圆角和边框的背景 2.单色和圆角的背景
那么哪一种方式更好,使用九宫格图片(nine-patch)还是可绘制的xml资源(drawable xml resource)?
1.渐变、圆角和边框的背景 2.单色和圆角的背景
那么哪一种方式更好,使用九宫格图片(nine-patch)还是可绘制的xml资源(drawable xml resource)?
我的猜测是,在大多数情况下,NinePatch
会稍微快一些。以下是我发现的。
GradientDrawable
(用于xml中的矩形)使用此代码调用Canvas
,然后使用原生调用导致SkCanvas
、SkDraw
,最终是SkScan
和SkBlitter
。
另一方面,NinePatch
的 draw() 在调用本地NinePatch.cpp之前几乎没有Java代码,该文件又调用NinePatchImpl.cpp
-- NinePatch_draw()
,这就是魔法所在。代码在这里迭代标记的区域,并在许多后续调用之后使用与SkDraw
相同的逻辑(只有drawRect()
而不是drawPath()
)绘制内容,但最终完成工作的仍然是相同的SkScan
和SkBlitter
。
GradientDrawable
会向整个本机堆栈进行两次调用 (看这里),而在任何情况下,NinePatch
只会进行一次调用。NinePatch
会赢得这场比赛:如果我们 [极其] 粗略地假设 drawRect()
和 drawPath()
的本机函数调用堆栈使用的逻辑基本相同,并且 [另一个极其简化的假设] 在那里传递并由 NinePatch
和 GradientDrawable
创建的参数集对方法的复杂性影响不是很大,那么 NinePatch
填充和轮廓的速度大约是 GradientDrawable
的两倍快。当然,前提是您使用常规的 9 段 9-Patch(即不要通过大量标记使您的 9-Patch 被撕裂,从而使对部分的迭代过程过于费力)。
任何碰巧看到这篇文章并了解更多相关主题(和/或更擅长估计本机代码复杂性)的人,请纠正我。
PS 是的,我知道这不是一个直接的答案NinePatches
获胜。 - Ivan Bartsov