Вопрос

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

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

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

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

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

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

Решение

Вот некоторые определения:

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

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

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

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

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

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

Другие советы

A conceptual overview of Window, Surface, Canvas, and Bitmap

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top