11

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

  1. 带渐变、圆角和边框的背景
  2. 只有一种颜色和圆角的背景

那么哪个变体会更好,九个补丁还是可绘制的 xml 资源?

4

1 回答 1

17

我的猜测是,NinePatch在大多数情况下会稍微快一些。这是我发现的。

GradientDrawable(用于 xml 中的 rects 的那个)使用此代码来调用Canvas它,然后使用本机调用导致SkCanvasSkDraw最终SkScanSkBlitter

另一方面,在本机呼叫之前NinePatchdraw()的java代码几乎为零,这就是魔术所在的地方。那里的代码在标记的区域上进行迭代,并且在多次后续调用之后使用大致相同的逻辑(仅代替)绘制内容,但最终它是相同的并且可以完成工作。NinePatch.cppNinePatchImpl.cppNinePatch_draw()SkDrawdrawRect()drawPath()SkScanSkBlitter

所有这些代码都很难让我立即理解,但真正引起我注意的是,如果它同时具有背景和描边(看这里GradientDrawable),它会对整个本机堆栈进行两次调用,而在任何情况下 a只会调用一次。NinePatch

所以,在没有实际测量这两种方法的时间的情况下,我感觉在大多数情况下会NinePatch赢得比赛:如果我们[糟糕]粗略地假设原生调用堆栈drawRect()drawPath()使用几乎相同的逻辑和[另一个糟糕的简化]得到的参数集在那里传递并由创建NinePatch并且GradientDrawable不会对方法的复杂性产生太大影响,然后NinePatch结果证明比GradientDrawable填充和轮廓快大约 2 倍。好吧,只要您使用常规的 9 节 9-Patch(即不要用大量标记将您的 9-Patch 撕成碎片,从而使对片段的迭代过于费力)。

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

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

于 2013-08-13T09:34:30.530 回答