我有一个困惑,期待对此发表一些评论。我假设 WebView 创建了一个单独的图面进行绘制,并且不使用活动的默认图面进行绘制。但是,在表面转储中,我没有看到在使用 webview 时创建新表面。
当我使用videoview进行类似的体验时,我看到创建了一个单独的表面。
在webview上,我还想播放一个视频,所以假设将创建一个单独的表面,因此表面分辨率将按照视频分辨率。但是,如果它使用应用程序的图面,则视频的最大分辨率必须是 UI 分辨率。
在铬代码中,我看到了单独表面的代码,但实际上我看不到一个被创建。
有人可以帮助我澄清这一点。
谢谢。
如果您查看VideoView继承图,您会注意到它继承自SurfaceView
,而WebView
则没有,因此WebView只能通过创建外部SurfaceView来实现这一点。
而如果您在 Chromium 代码的 WebView 部分中搜索 ExternalVideoSurface 的用法,您会注意到只有在启用"视频孔"时才启用它,这仅用于解码加密视频,其中 WebView 需要做"打孔"。WebView 中有一个系统 API 级别的设置可以启用此行为,但它有其自身的局限性,因此通常不建议使用。
我也很好奇网络视图不在 sufaceflinger dump 中。
我认为原因是webview也呈现到相关的活动本机窗口,因此在这种情况下没有另一个表面。
但是,在最新的Android和Webview版本中,开发人员的选择似乎有所不同。