我正在努力了解绘制到SurfaceView
的过程,因此要了解在android中使用的整个Surface
/Canvas
/Bitmap
系统。
我已经阅读了所有文章和API文档页面,这些页面可以在android-developers网站上找到,一些有关android图形的教程,LunarLander源代码和this question。
请告诉我,这些陈述中哪些是正确的,哪些不是,以及原因。
Canvas
附加了自己的Bitmap
。 Surface
附加了自己的Canvas
。 窗口的所有View
共享相同的Surface
,因此共享相同的Canvas
。 SurfaceView
是View
的子类,与其他View
的子类和View
本身不同,它有自己的Surface
可以插入。
另外还有一个问题:
如果已经有用于位图高级操作的Surface
,则为什么需要Canvas
类。举例说明Canvas
不适合Surface
可以完成的工作的情况。 以下是一些定义:
Surface是一个对象,其中包含要合成到屏幕的像素。您在屏幕上看到的每个窗口(对话框,全屏 Activity ,状态栏)都有其自己的曲面,Surface Flinger会以其正确的Z轴顺序将其渲染到最终的显示中。一个表面通常具有多个缓冲区(通常是两个)来进行双缓冲渲染:当表面镶边器使用最后一个缓冲区合成屏幕时,应用程序可以绘制其下一个UI状态,而无需等待应用程序完成绘画。 窗口基本上就像您在 table 面上想到的窗口一样。它具有单个Surface,其中呈现了窗口的内容。应用程序与“窗口管理器”交互以创建窗口。窗口管理器为每个窗口创建一个Surface并将其提供给应用程序进行绘制。应用程序可以在Surface中绘制任何所需的内容。窗口管理器只是一个不透明的矩形。 View 是窗口内部的交互式UI元素。窗口具有附加的单个 View 层次结构,该 View 层次结构提供了窗口的所有行为。每当需要重绘窗口时(例如,由于 View 自身无效),都会在窗口的Surface中完成此操作。曲面被锁定,这将返回可用于绘制到其中的Canvas。绘制遍历在层次结构中进行,将Canvas递给每个 View 以绘制其UI部分。完成后,将对Surface进行解锁和发布,以便将刚绘制的缓冲区交换到前景,然后由Surface Flinger将其合成到屏幕。 SurfaceView是View的一种特殊实现,它还创建了自己的专用Surface以供应用程序直接绘制到该窗口中(在普通 View 层次结构之外,否则必须共享窗口的单个Surface)。它的工作方式比您预期的要简单-所有SurfaceView所做的就是要求窗口管理器创建一个新窗口,告诉它以Z顺序将该窗口放置在SurfaceView窗口的正后方或正前方,并将其定位为与之匹配SurfaceView出现在包含窗口的位置。如果将表面放置在主窗口的后面(按Z顺序),SurfaceView也会用透明填充其主窗口的一部分,以便可以看到该表面。 位图只是一些像素数据的接口(interface)。直接创建像素时,像素可能是由位图本身分配的,或者它可能指向不属于自己的像素,例如在内部将Canvas挂接到Surface进行绘制时发生的内部情况。 (将创建一个位图,并指向Surface的当前图形缓冲区。)
另外,请记住,正如这暗示的那样,SurfaceView是一个非常重的对象。如果在特定的UI中有多个SurfaceView,请停下来考虑是否真的需要这样做。如果您有两个以上,则几乎可以肯定有太多。