Моя догадка, NinePatch
будет в большинстве случаев немного быстрее. Вот что я нашел.
GradientDrawable
(один используется для прямоугольников в XML) использует this code для вызова через к Canvas
, который в своей очереди, использует нативный вызов, ведущий к 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), тогда как в любом случае a NinePatch
только делает один.
Таким образом, без фактического измерения времени для обоих подходов я получаю чувство в большинстве случаев NinePatch
выигрывает гонку: если мы [очень] грубо предположить, что родные стеки вызовов для drawRect()
и drawPath()
использования в значительной степени та же логика и [еще одно ужасное упрощение] наборы параметров, которые передаются туда и создаются NinePatch
и GradientDrawable
, не влияют на сложность методов, которые много, то NinePatch
оказывается примерно в 2 раза быстрее, чем GradientDrawable
с заполнением и контуром. Ну, если вы используете обычный 9-секционный 9-патч (т. Е. Не обманываете вас 9-патчем огромным количеством маркеров, делая итерацию над кусками чрезмерно затратными усилиями).
Любой, кто наткнется на это и узнает больше о предмете (и/или лучше оценивает сложность собственного кода), пожалуйста, исправьте меня, если я ошибаюсь.
PS да, я знаю, что это не так много прямого ответа
Я dont't знаю! :) Но так как стандартные темы для Android используют 9patch, я бы предпочел, что делать это не может быть слишком неправильно. – pumpkee
I meen, если мне нужен только один цветной фон, возможно, xml resourse будет быстрее? По крайней мере, файл xml был бы меньшим размером – cooperok
, если вам нужен только один цвет, установите его с ним. не нужен ресурс изображения, не нужно xml config – MengMeng