【问题标题】:Android GUI architecture - relation between Surface/view/window/canvasAndroid GUI架构——Surface/view/window/canvas之间的关系
【发布时间】:2011-12-08 05:36:34
【问题描述】:

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

更新:经过几天的谷歌搜索和experiments,我找到了大部分愚蠢问题的答案。查看我提交的答案。

=========

Android Window 的职责是什么?

这里有几个问题:

  • 它是否负责收集和分派输入?
  • 视图和窗口是什么关系?和DFB中的surface和window的关系一样吗?
  • 活动和窗口之间有什么关系?每个 Activity 都会有一个窗口吗?
  • 是否可以从应用程序创建窗口?什么时候有必要?
  • Android 是否支持多窗口?

编辑:添加更多问题:

  1. Window、View、Canvas、Surface等各个类的职责是什么?它们之间是如何协作的?

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

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

  1. 每个窗口都有表面?每个 Canvas 都有表面?

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

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

  4. View 不拥有 Surface ,视图包含的 Window 拥有?

  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. 表面的尺寸是多少?会一直全屏吗?

【问题讨论】:

    标签: android frameworks view window directfb


    【解决方案1】:

    Window 是否负责收集和分派输入?

    没有。 ViewRoot 对此负责。

    视图和窗口是什么关系?与 DFB中表面和窗口的关系?

    ?

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

    是的,大多数时候。但是,SurfaceView 有自己的窗口。所以,如果一个 Activity 有一个 SurfaceView,它就会有多个 Window。

    是否可以从应用程序创建窗口?什么时候需要?

    没有必要。

    Android 是否支持多窗口?

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

    1.WindowViewCanvasSurface等各个类的职责是什么,它们之间是如何协作的? 2.一个Activity通常有多少个窗口?

    通常是一个。

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

    每个窗口都有一个表面,Surface 使用Canvas 在表面上绘图。

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

    是的。

    6.WindowManager负责Window stacking?这与SurfaceFlinger 有什么关系?

    不确定 WindowManager 的责任。 (待办事项)

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

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

    View 将使用 Canvas 在表面上绘制。视图附加到的窗口拥有该表面。

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

    8.View使用调用surface.lockCanvas()得到的canvas绘制自己?

    是的。

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

    onDraw() 将由 RootView 调用,并且在调用 invalidate 时。 canvas 参数是从 RootView 传递过来的。

    10.Canvas有尺寸吗? Window 的表面是否总是全屏显示?

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

    但是,据我了解,出于性能考虑,窗口的 Surface 不应始终全屏。但这一假设尚未得到验证。例如,statusBar 窗口不应该是全屏的。

    1.每个Activity 是否有一个ViewRoot 和一个Window

    是的。

    2.是否需要显式创建窗口?窗口的表面是否总是全屏?

    本身无需显式创建窗口。

    3.状态栏会在另一个窗口吗?

    是的。

    4.表面的尺寸是多少?会一直全屏吗?

    【讨论】:

      【解决方案2】:

      感谢您提出所有这些问题。 1) AFAIK 每个 Activity 至少有一个 ViewRoot 并且每个 ViewRoot 至少有一个窗口 2)没有必要明确创建窗口,我认为它应该始终是全窗口..虽然不确定这一点 3)是的,可以,我们可以将状态栏放在另一个窗口中 4) Not 可以是窗口的一部分,并不总是覆盖全屏。

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

      【讨论】:

        【解决方案3】:

        这里是关于 Window、Surface、Canvas 和 Bitmap 之间如何发生交互的非常基本且简单的概念概述。
        看看hackbodthis answer,很好的解释。

        【讨论】:

          【解决方案4】:

          问题

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

          不同意@pierrotlefou ,因为在google 中docSurfaceView 提供了一个专用的表面,而不是Window。

          表面是 Z 顺序的,因此它位于持有其 SurfaceView 的窗口后面; SurfaceView 在其窗口中打了一个孔以显示其表面。

          【讨论】:

            猜你喜欢
            • 2011-03-23
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 1970-01-01
            • 2011-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多