Настройка цвета фона для SurfaceView в Android

Я создаю приложение paint для android. Расширение образца приложения FingerPaint, поставляемого с SDK. Однако, в отличие от FingerPaint, я использую SurfaceView с отдельным потоком рендеринга для рисования на поверхность. Все это очень стандартно и просто. Работает хорошо. Я хочу, однако, дать белый цветной фон поверхности картины, так что это похоже на рисунок на белой бумаге. Фон по умолчанию черный. Нить моего вида поверхности вызывает onDraw () метод представления.

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

предположим, я установил фон в белый цвет. Теперь приложение запускается, и мой SurfaceView имеет белый цвет. Ладно, пока все хорошо. Теперь я проведу красную линию на этой поверхности., пальцем. Линия теперь показана на белой поверхности. Хороший. Теперь это должно быть приложение для рисования, и предположим, я хочу нарисовать автомобиль. Итак, я провожу пальцем вторую красную линию. Вторая линия нарисована на экране, но первая, которую я нарисовал ранее, исчезает. То есть, поскольку я установил некоторый фон для моего SurfaceView, фон рисуется снова, таким образом, перезаписывая 1-ю строку, которая была нарисована. Теперь на экране отображается только 2-я нарисованная линия.

очевидно, Я не хочу, чтобы это произошло. Код работает отлично, когда я не пытаюсь изменить фон (то есть обе строки отображаются на черном фоне по умолчанию, без фона эффективно). Но когда я устанавливаю желаемый фон, это происходит. Есть ли способ как-то было!--7-->static фон, который не рисуется каждый раз? Я хочу, чтобы фон был нарисован только один раз, все последующие рисунки должны произойти on этот фон. Мне не нужен андроид. runtime, чтобы нарисовать фон, каждый раз, когда он рисует мой вид, таким образом перезаписывая весь рисунок, присутствующий на этом представлении, из предыдущих визуализаций. Есть способ обойти это?

вещи, которые я пробовал, чтобы добиться этого:

  1. Настройка цвета фона моего SurfaceView с помощью android: background в XML.

  2. выполнение вышеизложенного, используя концепцию стиля. (указание значения стиля и ссылка на него в файле макета). Этот стиль просто определяет цвет фона как #FFFFFFFF (белый).

  3. установка стиля 2 в родительское представление SurfaceView (RelativeLayout).

  4. установка стиля 2 для всего приложения в качестве темы, используя android: theme в моем файле манифеста.

  5. установка фонового рисунка моего SurfaceView на изображение, которое является простым и белым.

  6. вызов setBackgroundColor для моего SurfaceView из кода как, это.setBackgroundColor(цвет.БЕЛЫЙ.)

спасибо.

2 ответов


по данным Android doc:

поверхность Z упорядочена так, что она находится за окном, удерживая ее SurfaceView; SurfaceView пробивает отверстие в своем окне, чтобы позволить его отображаемая поверхность. Иерархия представлений позаботится о правильно композитинг с поверхностью любых братьев и сестер SurfaceView это обычно появляется поверх него. Это можно использовать для размещения наложения, такие как кнопки на верхней части поверхности, хотя Примечание однако что это может повлиять на производительность, так как полная Альфа-смесь композит будет выполняться каждый раз при изменении поверхности

поэтому, если вы измените порядок Z вида поверхности через:

setZOrderOnTop(true);

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


теперь я также попытался наложить свой SurfaceView на другой вид с белым фоном и установить SurfaceView полностью прозрачным. Я так за это. То есть вид с белым фоном, на который наложен мой SurfaceView, установленный на полностью прозрачный.

Это также не сработало. Так что теперь я пришел к выводу, что цвет фона SurfaceView не может быть изменен. Итак, теперь я отбросил SurfaceView и использовал обычный вид вместо моего рисунки. До сих пор никаких потерь производительности не наблюдалось. Но кажется неправильным отказаться от эффективной реализации только потому, что SurfaceView не позволяет мне изменить цвет фона.