Понимание Android Canvas.saveLayer (...) - PullRequest
       20

Понимание Android Canvas.saveLayer (...)

9 голосов
/ 25 февраля 2011

Я надеюсь, что методы saveLayer позволят мне рисовать на разных «слоях», а затем, когда рисование закончится, объединить слои с холстом в любом порядке, который я выберу.

Очевидный вопрос заключается в том,"почему бы тебе просто не переставить свои операции рисования?"Ответ: я не могу:

У меня есть Путь, который мне нужно нарисовать на холсте.В фоновом / нижнем z-индексе я хочу нарисовать закрытый путь с несколькими дополнительными точками, используя стиль заливки.Кроме того, я хочу нарисовать контур только тех точек, которые изначально были на пути.

Поскольку я не могу отменить добавление точек на путь, я могу только клонировать путь,или нарисовать второй слой, который позже можно будет поместить поверх всего остального.

saveLayer (), кажется, предлагает эту функциональность, но не ведет себя так, как я ожидал.Основной поток моих операций выглядит следующим образом:

int overlay = canvas.saveLayer(...);
// drawing operations for my uppermost layer
...

int background = canvas.saveLayer(...);
// drawing operations for my background layer
...

// merge the offscreen background bitmap with the canvas:
canvas.restoreToCount(background);

// merge the offscreen overlay bitmap with the canvas:
canvas.restoreToCount(overlay);

Когда код выполняется, порядок фона и наложения вообще не изменился;то, что рисуется первым, находится внизу, а то, что рисуется последним, находится сверху.Еще более странным для меня является то, что я могу полностью закомментировать оба вызова restoreToCount (), и ничего не меняется.Согласно Javadoc, ничто не должно быть нарисовано на холсте до тех пор, пока не будет вызвано восстановительное восстановление ().

Очевидно, я совершенно не понимаю функцию этого метода.Кто-нибудь может помочь мне понять использование saveLayer, или, возможно, предложить альтернативный способ наложения слоев моих операций рисования?

Спасибо!Ник

1 Ответ

9 голосов
/ 25 февраля 2011

saveLayer () не позволяет вам переставлять слои в случайном порядке. Единственный способ сделать это - нарисовать растровые изображения самостоятельно. Также обратите внимание, что родительский объект вашего представления будет вызывать save () / restore () вокруг вашего вызова onDraw (), что приведет к компоновке ваших слоев.

...