安卓GUI架构 - Surface/view/window/canvas之间的关系

32

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

更新:经过数天的谷歌搜索和实验,我已经找到了大多数愚蠢问题的答案。请查看我提交的答案。

=========

Android Window的职责是什么?

以下是一些问题:

  • 它负责收集和分派输入吗?
  • 视图与窗口之间的关系是什么?与DFB中窗口和表面之间的关系相同吗?
  • 活动和窗口之间的关系是什么?每个Activity都有一个窗口吗?
  • 是否可以从应用程序创建窗口?何时需要?
  • Android支持多窗口吗?

编辑:增加更多问题:

  1. 各种类(如Window、View、Canvas、Surface)的职责是什么,它们如何协作?

  2. 一个Activity通常有多少个窗口?

3.一个Activity中的所有视图是否都会附加到Window上?"附加"是什么意思?

  1. 每个窗口都有表面吗?每个画布都有表面吗?

  2. View负责焦点/键事件管理,而Canvas仅负责"绘制"操作。

  3. WindowManager负责窗口层叠?这与SurfaceFlinger的关系是什么?

  4. 视图不拥有Surface,包含视图的窗口拥有吗?

  5. View使用通过surface.lockCanvas()调用获取的画布进行绘制。

  6. 何时会调用onDraw(Canvas)?如何传递画布参数?

  7. Canvas是否具有大小?Window的表面始终是全屏吗?

再次编辑:

在观看了Romain Guy提供的这个精彩演示http://www.youtube.com/watch?v=duefsFTJXzc&feature=feedwll&list=WL之后,一些问题得到了解决,同时增加了一些新问题 :)

  1. 每个Activity都会有一个ViewRoot并且有一个Window吗?
  2. 是否需要显式地创建一个窗口?窗口的表面始终是全屏的吗?
  3. 状态栏是否在另一个窗口中?
  4. 表面的大小是多少?那总是全屏的吗?
4个回答

14

Window是否负责收集并分派输入事件?

不是的。ViewRoot负责此操作。

视图与窗口之间的关系是什么?与DFB中窗口和表面之间的关系相同吗?

Activity和Window之间的关系是什么?每个Activity都有一个Window吗?

大多数情况下是这样的。但是,SurfaceView具有自己的Window。因此,如果Activity有SurfaceView,则会有多个Window。

是否可以从应用程序创建一个Window?什么时候需要这样做?

不需要。

Android支持多窗口吗?

当然。使用Hierarchy View可以清楚地看到系统中存在多个Window。

1.各种类(如WindowViewCanvasSurface)的职责是什么,它们如何相互协作? 2.一个Activity通常有多少个Window?

通常只有一个。

3.一个Activity中的所有视图是否都会附加到一个Window上?“附加”是什么意思? 4.每个窗口都有一个表面吗?每个画布都有一个表面吗?

每个Window都有一个Surface,而Surface使用Canvas在Surface上进行绘制。

5.View负责管理焦点/键事件,而Canvas仅负责“绘制”操作?

是的。

6.WindowManager负责窗口堆叠?它如何与SurfaceFlinger相关?

不确定WindowManager的职责。(待办)

SurfaceFlinger 用于合成与不同 Window/Activity 相关联的 Surface。

7. View 不拥有 Surface,包含 View 的 Window 拥有吗?

View 将使用 Canvas 在 Surface 上进行绘制。包含该 View 的 Window 拥有该 Surface。

这可以通过实现一个自定义视图来理解,在您的派生类中覆盖 onDraw(Canvas) 方法。

8. View 使用通过调用 surface.lockCanvas() 获得的 Canvas 进行绘制吗?

是的。

9. onDraw(Canvas) 是何时以及如何被调用的,谁传递 Canvas 参数?

onDraw() 将由 RootView 调用,并在调用 invalidate 时进行调用。Canvas 参数从 RootView 传递。

10. Canvas 有尺寸吗?Window 的 surface 总是全屏吗?

我不能确定。但是当我创建自定义视图时,从 onDraw(Canvas) 中获取的 Canvas 尺寸是全屏的。

然而,据我了解,出于性能考虑,窗口的 Surface 不应总是全屏。但是这个假设尚未得到验证。例如,状态栏窗口不应该是全屏的。

1. 每个 Activity 都会有一个 ViewRoot,因此有一个 Window 吗?

是的。

2. 是否需要显式创建窗口?Window 的 surface 总是全屏吗?

不需要显式创建窗口。

3. 状态栏是否在另一个 Window 中?

是的。

4. Surface 的大小是多少?总是全屏吗?


4
感谢您提出那些问题。 1) 据我所知,每个Activity至少有一个ViewRoot,而每个ViewRoot至少有一个window。 2) 没有必要显式创建窗口,我认为它应该始终是全屏窗口..虽然不确定这一点。 3) 是的,可以将状态栏放置在另一个窗口中。 4) 不一定是整个屏幕,也可以是窗口的一部分。
如果我说错了什么,请纠正我的理解。

1

Android: Window, Surface, Canvas, and Bitmap concept

这是一个关于Window、Surface、Canvas和Bitmap之间交互的非常基础和简单的概念概述。
请看hackbod答案,有很好的解释。

0

针对这个问题:

活动和窗口之间的关系是什么?每个Activity都有一个窗口吗?

我不同意@pierrotlefou的看法,因为在Google doc中SurfaceView提供了一个专用的surface,而不是Window。

该表面被Z排序,使其位于持有其SurfaceView的窗口后面;SurfaceView在其窗口中打一个洞,以允许其表面显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接