Android GUI架构 – Surface / view / window / canvas之间的关系

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

更新:经过几天的谷歌search和实验 ,我发现了大多数愚蠢的问题的答案。 看到我提交的答案。

=========

Android Window的责任是什么?

这里有一些问题:

  • 是否负责收集和发送投入?
  • 视图和窗口之间的关系是什么? 与DFB中的曲面和窗口之间的关系一样吗?
  • 活动和窗口之间的关系是什么? 每个活动都会有一个窗口吗?
  • 是否有可能从应用程序创build一个窗口? 什么时候有必要?
  • Android是否支持多窗口?

编辑:添加更多的问题:

  1. 什么是各种职业的责任,如窗口,视图,canvas,表面和他们如何相互协作?

  2. 一个Activity有多less个窗口?

3.将一个Activity中的所有视图都附加到Window? 附件是什么意思?

  1. 每个窗户都有表面? 每个帆布都有表面?

  2. View负责focus / keyEvent / manager,而Cavus只负责“绘制”操作。

  3. WindowManager负责窗口堆栈? 这与SurfaceFlinger有什么关系?

  4. 视图不拥有一个表面,视图包含的视图拥有?

  5. 视图通过调用surface.lockCanvas()使用canvas绘制自己。

  6. 当onDraw(canvas)将被调用? 如何以及谁传递canvas参数?

  7. canvas有尺寸吗? 窗户的表面总是全屏?

再次编辑:

在观看Romain Guy http://www.youtube.com/watch?v=duefsFTJXzc&feature=feedwll&list=WL提供的精彩礼物之后,我们解决了几个问题并添加了更多:)

  1. 将每个活动有一个ViewRoot,从而一个窗口?
  2. 有没有必要明确创build一个窗口? 和窗口的表面总是全屏?
  3. 状态栏会在另一个窗口中吗?
  4. 表面的大小是多less? 这将永远是全屏?

Solutions Collecting From Web of "Android GUI架构 – Surface / view / window / canvas之间的关系"

Window负责收集和发送input信息?

ViewRoot对此负责。

视图和窗口之间的关系是什么? 与DFB中的曲面和窗口之间的关系一样吗?

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

是的,大部分时间。 但是,一个SurfaceView有它自己的窗口。 所以,如果一个Activity有一个SurfaceView,它将有多个Window。

是否有可能从应用程序创build一个窗口? 什么时候有必要?

不必要。

Android是否支持多窗口?

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

1. WindowViewCanvasSurface等各类课程的职责是什么?他们如何协作? 2.一个Activity有多less个窗口?

通常是一个。

3.将一个Activity中的所有视图都附加到一个窗口中? 附件是什么意思? 4.每个窗口都有一个表面? 每个canvas都有一个表面?

每个窗口都有一个曲面, Surface使用CanvasSurface上绘制。

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

是。

6. WindowManager负责窗口堆栈? 这与SurfaceFlinger什么关系?

不确定WindowManager的责任。 (去做)

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

7.View没有拥有一个Surface,包含的视图拥有的Window?

视图将使用canvas在表面上绘制。 视图所附的窗口拥有表面。

这可以通过实现一个定制视图来理解,当你应该重写派生类中的onDraw(Canvas)方法。

8.视图使用通过调用surface.lockCanvas()得到的canvas绘制自己。

是。

9.什么时候以及如何调用onDraw(Canvas) ,谁传递canvas参数?

onDraw()将被RootView调用,当invalidate被调用时。 canvas参数从RootView传递。

10.canvas的尺寸是多less? 一个窗口的表面总是全屏?

我不能肯定地说。 但是当我创build一个自定义视图时,从onDraw(Canvas)获得的canvas的大小是全屏的。

但是,就我的理解而言,出于性能考虑,窗口的Surface不应该总是全屏。 但是这个假设还没有被证实。 例如,statusBar窗口不应该是全屏。

1.每个Activity都有一个ViewRoot ,从而一个Window

是。

2.是否需要明确创build一个窗口? 窗户的表面总是全屏吗?

不需要明确地创build窗口本身。

3.将状态栏放在另一个窗口中?

是。

4.表面的大小是多less? 这将永远是全屏?

感谢你问了所有这些问题。 1)AFAIK每个活动有更改一个ViewRoot和每个ViewRoot至less有一个窗口2)没有必要明确地创build窗口,我认为它应该始终是全窗口..虽然不知道这个3)是的,它可以是,我们可以将状态栏放在另一个窗口中4)不是可以是窗口的一部分,并不总是覆盖全屏。

如果我在这里说错了,请纠正我的理解。

Android:Window,Surface,Canvas和Bitmap概念

这里是一个非常基本和简单的概念,概述了如何在Window,Surface,Canvas和Bitmap之间进行交互。
用hackbod来看这个答案 ,很好的解释。