我在C++中开发了一个非常简单的跨平台窗口类,所以我有一个要渲染的表面。到目前为止,我已经让它在linux和windows上运行。在操作系统上运行之后,我想让它在我的android手机上运行。
但是,我需要知道所有用surfaceflinger创建的“窗口”是全屏的还是只能占用桌面的一部分,比如linux或windows上的窗口?我这样问是因为我知道我可以在手机桌面上放置小部件,但我从未见过应用程序像弹出窗口或在桌面上悬停的框架那样做。
如何创建一个比手机分辨率小的“窗口”?它只是中心的可拉伸表面和留下黑色边框?一个应用程序也可以有多个“窗口”?
最佳答案
顾名思义,surfaceflinger处理的是表面,而不是窗口。
每个窗口实际上都包含一个可以绘制的曲面,但这些是不同类型的类。
每当以某种方式创建或更改某个应用程序窗口的viewrootimpl(窗口的俯视图)时,就会调用windowmanagerservice的relayout函数。
现在,跳过一些无聊的细节,windowmanagerservice创建了一个曲面。
一个曲面可以是任意大小,如果您使用多个显示器,它甚至可以附加到某个显示器(尽管这尚未实现)。
这让我们回到你的问题:
-一个表面(如果你喜欢的话可以是窗口)可以是任何大小。您提到的黑色边框实际上来自当前窗口下面的窗口(并被涂成黑色)。
-是的,一个应用程序可以有多个窗口(例如,一个窗口可以是一个对话框)。
至于widgets,我知道launcher(桌面应用程序)是如何支持它们并支持它们的拖放行为的,但我从来没有问过自己,它们是否真的是新的windows,所以我无法回答这个问题。