Intereting Posts
Ошибка при запуске Android-проекта в Intellij IDEA Ошибки Facebook, связанные с auth.extendSSOAccessToken «AndroidHttpTransport не может быть разрешен к ошибке типа в ksoap2 AppWidgetManager.getAppWidgetIds в действии возвращает пустой список Невозможно установить обратный вызов при загрузке пользовательской временной шкалы с помощью набора Fabric Twitter Kit в приложении для Android Отправка SMS на реальное тестовое устройство (не эмулятор) через экземпляр DDMS или эмулятора Android: Позвольте пользователю выбрать изображение или видео из галереи Как разрешить доменное имя Bonjour с помощью JmDNS Textview не прокручивается внутри пользовательского списка Доступ к LogCat с Android через Python Реализация виноградной лозы, как видеозапись в андроиде? Android TextView Экспорт Android-приложения с помощью ProGuard дает ошибку ParseException Какой путь к файловой системе используется в Context.openFileOutput () Android? Xamarin формирует изображение андроида не сжимается

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

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

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

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

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

То, что я пробовал, для этого:

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

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

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

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

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

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

Благодарю.

Согласно доктору android :

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

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

setZOrderOnTop(true); 

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

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

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