Архитектура графического интерфейса Android - связь между Surface / view / window / canvas - PullRequest
31 голосов
/ 15 октября 2011

=========================

ОБНОВЛЕНИЕ: после нескольких дней поиска в Google и экспериментов , янашли ответы на большинство этих глупых вопросов.Смотрите ответы, которые я отправил.

=========

За что отвечает Android Window?

Вот несколько вопросов:

  • Отвечает ли он за сбор и диспетчеризацию ввода?
  • Какая связь между видом и окном?То же, что и отношения между поверхностью и окном в DFB?
  • Какая связь между действием и окном?Будет ли в каждом действии окно?
  • Можно ли создать окно из приложения?А когда это надо?
  • Поддерживает ли Android многооконный режим?

РЕДАКТИРОВАТЬ: Добавить дополнительные вопросы:

  1. Каковы обязанности различных классов, например Window, Вид, Холст, Поверхность и как они взаимодействуют друг с другом?

  2. Сколько окон обычно есть у Действия?

3.Будет ли всепредставления в одном действии будут прикреплены к окну?Что означает прикрепление?

  1. Каждое окно имеет поверхность?Каждый холст имеет поверхность?

  2. View отвечает за focus / keyEvent / manager, а Cavus отвечает только за операцию «рисования».

  3. WindowManager отвечает за Windowукладки?Как это связано с SurfaceFlinger?

  4. Представлению не принадлежит поверхность, окну принадлежит принадлежащее представлению?

  5. Представление рисует самиспользование canvas, полученное вызовом surface.lockCanvas ().

  6. Когда будет вызываться onDraw (Canvas)?Как и кто передает параметры холста?

  7. Имеет ли Canvas размер?Поверхность окна всегда будет полноэкранной?

Снова отредактируйте:

После просмотра этого замечательного подарка, предоставленного Romain Guy http://www.youtube.com/watch?v=duefsFTJXzc&feature=feedwll&list=WL, будет решено несколько вопросов идобавить еще несколько:)

  1. Будет ли в каждом действии один ViewRoot и, следовательно, одно окно?
  2. Есть ли необходимость явно создавать окно?и Поверхность окна всегда будет полноэкранной?
  3. Будет ли строка состояния находиться в другом окне?
  4. Каков размер поверхности?Это всегда будет полноэкранный режим?

Ответы [ 3 ]

13 голосов
/ 23 ноября 2011

Является ли Window ответственным за сбор и отправку ввода?

Нет. За это отвечает ViewRoot.

Какая связь между видом и окном? Такой же как связь между поверхностью и окном в DFB?

Какая связь между действием и окном? Будет ли у каждого вида деятельности окно?

Да, большую часть времени. Однако SurfaceView имеет собственное окно. Таким образом, если у Activity есть SurfaceView, у него будет более одного окна.

Можно ли создать окно из приложения? А когда это необходимо?

Не обязательно.

Поддерживает ли Android многооконный режим?

Конечно. Используя HierachyView, вы можете четко видеть, что в системе существует более одного окна.

1. Каковы обязанности различных классов, таких как Window, View, Canvas, Surface, и как они сотрудничают друг с другом? 2. Сколько окон обычно имеют Активность?

Обычно один.

3. Будут ли все виды в одном действии прикреплены к окну? Что значит прикрепить? 4. У каждого окна есть поверхность? У каждого холста есть поверхность?

Каждое окно имеет поверхность, а Surface использует Canvas для рисования на поверхности.

5.View отвечает за управление событиями фокуса / клавиши, в то время как Canvas отвечает только за операцию «рисования»?

YES.

6. WindowManager отвечает за укладку окон? Как это относится к SurfaceFlinger?

Не уверен в ответственности WindowManager. (TODO)

SurfaceFlinger используется для составления Поверхности, связанной с различными окнами / действиями.

7.Просмотру не принадлежит поверхность, а окну, в котором содержится вид?

Вид будет рисоваться на поверхности с помощью Canvas. Окно, к которому прикреплен вид, владеет поверхностью.

Это можно понять, реализовав настраиваемое представление, когда вы должны переопределить метод onDraw(Canvas) в своем производном классе.

8. Вид рисует сам, используя холст, полученный вызовом surface.lockCanvas ()?

YES.

9. Когда и как вызывается onDraw(Canvas) и кто передает параметры canvas?

onDraw() будет вызываться RootView и при вызове invalidate. Параметр canvas передается из RootView.

10. У Canvas есть размер? Поверхность окна всегда будет полноэкранной?

Не могу точно сказать. Но когда я создаю настраиваемое представление, размер холста, полученного из onDraw (Canvas), составляет полный экран.

Однако, в моем понимании, для повышения производительности поверхность для окна не всегда должна быть полноэкранной. Но это предположение не было проверено. Например, окно statusBar не должно быть полноэкранным.

1.Будет ли в каждом Activity один ViewRoot и, следовательно, один Window?

YES.

2. Есть ли необходимость явно создавать окно? Поверхность окна всегда будет на весь экран?

Нет необходимости создавать окно как таковое.

3.Будет ли строка состояния в другом окне?

YES.

4. Каков размер поверхности? Это всегда будет полноэкранный режим?

4 голосов
/ 22 ноября 2011

Ценю, что вы задали все эти вопросы.1) AFAIK каждая активность имеет по крайней мере один ViewRoot, и каждый ViewRoot имеет по крайней мере одно окно 2) Нет необходимости явно создавать окно, и я думаю, что оно всегда должно быть полным окном .. хотя и не уверены в этом 3) Да, это может быть, мыможет размещать строку состояния в других окнах. 4) Не может быть частью окна, не всегда покрывает весь экран.

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

1 голос
/ 21 июля 2016

Android: Window, Surface, Canvas, and Bitmap concept

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

...