-
14-10-2019 - |
题
我正在努力理解绘画的过程 SurfaceView
因此整体 Surface
/Canvas
/Bitmap
系统,用于Android。
我已经阅读了所有文章和API文档页面,我能够在Android-Developers网站,一些Android Graphics,Lunarlander Source Code和 这个问题.
请告诉我,这些陈述中的哪个是正确的,什么不是,为什么。
Canvas
有它自己的Bitmap
附着在上面。Surface
有它自己的Canvas
附着在上面。- 全部
View
窗口的共享Surface
因此共享相同的Canvas
. SurfaceView
是子类View
, ,这与其他不同View
的子类和View
本身,有自己的Surface
画画。
还有一个其他问题:
- 为什么需要一个
Surface
上课,如果已经有一个Canvas
用于使用位图的高级操作。举一个情况的例子Canvas
不适合做工作Surface
可以做。
解决方案
这是一些定义:
表面是固定像素的对象,该对象被合成到屏幕上。您在屏幕上看到的每个窗口(对话框,您的全屏活动,状态栏)都有其自己的表面,并且表面Flinger将其在其正确的Z订单中呈现到最终显示。表面通常有多个缓冲区(通常两个)进行双缓冲渲染:应用程序可以在表面闪烁时使用最后一个缓冲区在屏幕上绘制其下一个UI状态,而无需等待应用程序完成绘画。
窗口基本上就像您想到桌面上的窗口一样。它具有单个表面,其中窗口的内容呈现。应用程序与窗口管理器进行交互以创建Windows;窗口管理器为每个窗口创建一个表面,并将其提供给绘图应用程序。该应用程序可以在表面上绘制任何想要的东西;对于窗口管理器,这只是一个不透明的矩形。
视图是窗口内部的交互式UI元素。窗口上有一个单个视图层次结构,该窗口提供了窗口的所有行为。每当需要重新绘制窗口时(例如,因为视图本身无效),就可以在窗口的表面中完成。表面被锁定,返回可用于抽入其中的画布。沿层次结构进行了抽奖遍历,将画布递给每个视图以绘制其UI的一部分。完成后,将表面解锁并张贴,以便将Just绘制的缓冲区换到前景,然后通过表面fling弹到屏幕上。
SurfaceView是视图的特殊实现,它还创建了自己的专用表面,以直接绘制到(在正常视图层次结构之外),否则必须为窗口共享单个表面)。此工作的工作方式比您预期的要简单 - 所有Surfaceview的工作都是要求窗口管理器创建一个新窗口,并告诉Z-order z-order thit窗口,要么在SurfaceView窗口的后面或前面,并将其定位以匹配SurfaceView出现在包含窗口中的位置。如果将表面放置在主窗口后面(按z顺序),则表面视图还以透明度填充了主窗口的一部分,以便可以看到表面。
位图只是某些像素数据的接口。当您直接创建一个像素时,可以通过位图本身分配像素,或者可能指向它不拥有的像素,例如内部发生的帆布挂在表面上以进行绘图。 (创建位图并指向表面的当前绘图缓冲区。)
另外,请记住,正如这所暗示的那样,表面视图是一个非常重量的对象。如果您在特定的UI中有多个表面视图,请停下来考虑是否真的需要。如果您有两个以上,那么您几乎肯定有太多。
其他提示
位图只是用于像素集合的包装器。将其视为具有其他方便功能的一系列像素。
画布只是包含所有绘图方法的类。如果您熟悉AWT/SWIST中的图形类别。画布内部包含有关如何绘制圆或盒子等的所有逻辑。帆布绘制了位图或开放的GL容器,但没有理由为什么将来可以将其扩展到其他类型的栅格上。
表面视图是包含表面的视图。表面类似于位图(它具有像素存储)。我不知道它是如何实现的,但是我想这是一种与屏幕显示直接相关的事物的额外方法(这是表面的原因,位图太通用的原因)。您可以从表面获得画布,这确实使画布与基础位图关联。
你的问题。
1.存在的群岛上有自己的位图。表面有自己的帆布。
是的,画布在位图(或开放式GL面板)上运行。 Surface为您提供了一个在其位图样式像素存储的表面上运行的帆布。
2.所有窗口的视图共享相同的表面,因此共享相同的画布。
否。您可以根据需要拥有尽可能多的表面视图。
3. SURFACEVIEW是视图的子类,与其他视图的子类别和视图不同,它具有自己的表面值。
是的。就像ListView是一个具有自己的列表数据结构的视图子类。每个视图的每个子类都会做一些不同的事情。