Настройка цвета фона для SurfaceView в Android - PullRequest
7 голосов
/ 15 декабря 2011

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

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

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

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

То, что я пытался достичь, это:

  1. Установка цвета фона моего SurfaceView с использованием android: background в XML.

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

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

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

  5. Установка фона для рисования моего SurfaceView на изображение простого и белого цвета.

  6. Вызов setBackgroundColor для моего SurfaceView из кода как this.setBackgroundColor (Color.WHITE).

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

в соответствии с документом для Android :

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

, поэтому, если вы измените z-порядок вида поверхности с помощью:

setZOrderOnTop(true);

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

1 голос
/ 16 декабря 2011

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

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

...