为某些视图设置背景的最佳方法是什么?例如背景的 2 个变体:
- 带渐变、圆角和边框的背景
- 只有一种颜色和圆角的背景
那么哪个变体会更好,九个补丁还是可绘制的 xml 资源?
为某些视图设置背景的最佳方法是什么?例如背景的 2 个变体:
那么哪个变体会更好,九个补丁还是可绘制的 xml 资源?
我的猜测是,NinePatch
在大多数情况下会稍微快一些。这是我发现的。
GradientDrawable
(用于 xml 中的 rects 的那个)使用此代码来调用Canvas
它,然后使用本机调用导致SkCanvas
,SkDraw
最终SkScan
和SkBlitter
。
另一方面,在本机呼叫之前,NinePatch
draw()的java代码几乎为零,这就是魔术所在的地方。那里的代码在标记的区域上进行迭代,并且在多次后续调用之后使用大致相同的逻辑(仅代替)绘制内容,但最终它是相同的并且可以完成工作。NinePatch.cpp
NinePatchImpl.cpp
NinePatch_draw()
SkDraw
drawRect()
drawPath()
SkScan
SkBlitter
所有这些代码都很难让我立即理解,但真正引起我注意的是,如果它同时具有背景和描边(看这里GradientDrawable
),它会对整个本机堆栈进行两次调用,而在任何情况下 a只会调用一次。NinePatch
所以,在没有实际测量这两种方法的时间的情况下,我感觉在大多数情况下会NinePatch
赢得比赛:如果我们[糟糕]粗略地假设原生调用堆栈drawRect()
并drawPath()
使用几乎相同的逻辑和[另一个糟糕的简化]得到的参数集在那里传递并由创建NinePatch
并且GradientDrawable
不会对方法的复杂性产生太大影响,然后NinePatch
结果证明比GradientDrawable
填充和轮廓快大约 2 倍。好吧,只要您使用常规的 9 节 9-Patch(即不要用大量标记将您的 9-Patch 撕成碎片,从而使对片段的迭代过于费力)。
任何会偶然发现这一点并且对这个主题有更多了解(和/或更好地估计本机代码的复杂性)的人,如果我错了,请纠正我。
PS是的,我知道这不是一个直接的答案