发布网友 发布时间:2024-10-24 09:31
共1个回答
热心网友 时间:2024-10-25 09:16
Android系统支持三种屏幕类型:主屏、外屏和虚拟屏。其中,虚拟屏即Virtual Display,其用途广泛,如屏幕录制、无线显示等,主要功能是抓取屏幕显示的内容。
实现Virtual Display抓取屏幕内容的方式有多种,例如通过ImageReader进行读取。Android系统中的SurfaceFlinger组件支持内部屏幕、外部屏幕及虚拟屏幕在内的多个输出屏幕。虚拟屏幕可以与主屏共享层堆叠,也可拥有独立的层。内部屏幕的VSYNC信号可触发所有屏幕的合成过程。
在支持虚拟屏幕的HWC实现中,虚拟屏幕能够与OpenGL ES、HWC或GLES以及HWC进行合成。对于不支持虚拟屏幕的实现,虚拟屏幕始终使用GLES进行合成。
创建Virtual Display的示例代码如下:
createVirtualDisplay(name, width, height, densityDpi, surface, flags);
或
createVirtualDisplay(name, width, height, densityDpi, surface, flags, callback, handler);
其中,参数包括:name(虚拟显示器的名称,非空);width(虚拟显示器的宽度,像素单位,大于0);height(虚拟显示器的高度,像素单位,大于0);densityDpi(以dpi为单位的虚拟显示器密度,大于0);surface(虚拟显示器内容渲染的目标表面,初始无则为null);flags(虚拟显示标志的组合,如公共、展示、安全、仅自定义内容或自动镜像);callback(状态改变时调用的回调);handler(用于调用侦听器的处理程序,如果在调用线程的Looper上调用侦听器,则为null)。
创建后,虚拟显示的内容将被渲染到由应用程序提供的Surface上。虚拟显示的行为受提供的标志控制,通常默认为私有、非展示和非安全。某些标志可能需要特定权限。