Подтвердить что ты не робот

Понимание концепций холста и поверхности

Я пытаюсь понять процесс рисования на SurfaceView и, следовательно, всю систему Surface/Canvas/Bitmap, которая используется в Android.

Я прочитал все статьи и страницы документации API, которые я смог найти на сайте разработчиков Android, несколько уроков графики для Android, исходный код LunarLander и этот вопрос.

Скажите, пожалуйста, какие из этих утверждений верны, а какие нет, и почему.

  • Canvas имеет свой собственный Bitmap, прикрепленный к нему. Surface имеет свой собственный Canvas, прикрепленный к нему.
  • Все View окна имеют один и тот же Surface и, таким образом, имеют один и тот же Canvas.
  • SurfaceView является подклассом View, который, в отличие от других подклассов View и View, имеет свой собственный Surface для рисования.

Есть еще один вопрос:

  • Почему существует необходимость в классе Surface, если для операций высокого уровня с растровым изображением уже существует Canvas. Приведите пример ситуации, когда Canvas не подходит для выполнения работы, которую может выполнять Surface.
4b9b3361

Ответ 1

Вот несколько определений:

  • A Поверхность - это объект, содержащий пиксели, которые компонуются на экране. Каждое окно, которое вы видите на экране (диалог, полноэкранная активность, строка состояния), имеет свою собственную поверхность, к которой он обращается, и Surface Flinger отображает их на конечном дисплее в их правильном Z-порядке. Поверхность обычно имеет более одного буфера (обычно два) для выполнения двойной буферизации рендеринга: приложение может рисовать свое следующее состояние пользовательского интерфейса, в то время как поверхностный flinger компонует экран с использованием последнего буфера, не дожидаясь завершения приложения рисунок.

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

  • Вид - это интерактивный элемент пользовательского интерфейса внутри окна. Окно имеет единую иерархию представлений, которая обеспечивает все поведение окна. Всякий раз, когда окно нужно перерисовать (например, поскольку представление недействительно), это делается в окне Surface. Поверхность заблокирована, которая возвращает холст, который можно использовать для рисования. Обход ничьей осуществляется по иерархии, передавая холст вниз для каждого представления, чтобы нарисовать его часть пользовательского интерфейса. После этого поверхность будет разблокирована и размещена так, чтобы только что нарисованный буфер был заменен на передний план, а затем был скомпонован на экран с помощью поверхностного Flinger.

  • SurfaceView - это специальная реализация View, которая также создает свою собственную выделенную Surface для приложения, которое непосредственно втягивается (за пределами обычной иерархии представлений, которая в противном случае должна использовать единую Surface для окна). То, как это работает, проще, чем вы можете ожидать, - все, что SurfaceView делает, просит диспетчера окон создать новое окно, сообщая ему в Z-порядке это окно либо сразу же, либо перед окном SurfaceView, и позиционируя его в соответствии с где SurfaceView появляется в содержащем окне. Если поверхность находится за основным окном (в порядке Z), SurfaceView также заполняет свою часть основного окна прозрачностью, чтобы поверхность могла быть видна.

  • Растровое изображение - это просто интерфейс для некоторых пиксельных данных. Пиксели могут быть выделены с помощью самого Bitmap, когда вы непосредственно создаете его, или он может указывать на пиксели, которые у него отсутствуют, например, то, что внутренне происходит, чтобы зацепить холст до поверхности для рисования. (Растровое изображение создается и указывается на текущий буфер рисования поверхности.)

Кроме того, имейте в виду, что SurfaceView - это довольно тяжелый объект. Если у вас несколько SurfaceViews в определенном пользовательском интерфейсе, остановитесь и подумайте, действительно ли это необходимо. Если у вас более двух, у вас почти наверняка будет слишком много.

Ответ 2

Концептуальный обзор окна, поверхности, холста и растрового изображения

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

Ответ 3

Растровое изображение - это просто оболочка для набора пикселей. Подумайте об этом как о массиве пикселей с некоторыми другими удобными функциями.

Canvas - это просто класс, содержащий все методы рисования. Это похоже на класс Graphics в AWT/Swing, если вы знакомы с этим. Вся логика о том, как рисовать круг, или поле и т.д. Содержится внутри Canvas. Холст рисует битмап или открытый контейнер GL, но нет причин, по которым в будущем его можно было бы расширить, чтобы нарисовать другие типы растров.

SurfaceView - это представление, содержащее поверхность. Поверхность похожа на растровое изображение (оно имеет хранилище пикселей). Я не знаю, как это реализовано, но я бы предположил, что это какая-то оболочка Bitmap с дополнительными методами для вещей, которые напрямую связаны с экранными дисплеями (вот причина для поверхности, растровое изображение слишком общее). Вы можете получить Canvas с вашего Surface, который действительно получает Canvas, связанный с базовым Bitmap.

Ваши вопросы.

1.Canvas имеет свой собственный Bitmap, прикрепленный к нему. У поверхности есть свой Canvas, прикрепленный к ней.

Да, холст работает на растровом изображении (или открытой панели GL). Поверхность дает вам холст, который работает на любой поверхности, используемой для хранилища пикселей в стиле Bitmap.

2.Все окно просмотра имеет одну и ту же поверхность и, таким образом, имеет один и тот же холст.

Нет. У вас может быть столько поверхностей, сколько хотите.

3.SurfaceView - это подкласс View, который, в отличие от других подклассов View и самого представления, имеет свою собственную Surface для рисования.

Да. Подобно тому, как ListView является подклассом View, который имеет свою собственную структуру данных List. Каждый подкласс View делает что-то другое.