13. 多屏显示¶
本篇带来的是在Android 系统下多屏显示相关的相关内容。
13.1. 主屏和副屏¶
Android 系统中存在多个物理限时,有主屏、副屏之分,在 Android 中,主屏指的是设备默认的、主要的显示屏幕, 而副屏则是指通过 HDMI、DP 或其他方式连接的外部显示器。为了支持多屏显示,Android 提供了相应的 API 和机制来检测和管理多个显示屏的内容输出。
主屏:这是用户通常与之交互的屏幕,运行着应用程序的主要界面。所有未特别指定显示位置的 UI 元素默认都会显示在主屏上。
副屏:这是额外连接的屏幕,可以用来扩展或镜像主屏的内容。副屏上的内容可以通过特定的布局文件和代码逻辑来控制。
13.2. 多屏同显¶
多屏同显是指在多个屏幕上显示相同内容的功能。在多屏同显的情况下,实际上是通过逻辑副屏将主屏的显示内容传输到物理副屏上进行显示。 这种机制确保了所有连接的屏幕都能同步呈现一致的画面,提供更好的视觉体验和交互效果。
图形生成:应用程序将生成的图像数据或者获取到的图像数据发送到 GPU 或 VPU(视屏处理单元)进行渲染。
图像处理:经过渲染后的图像数据会通过内部总线传递给相应的显示控制器。
同步输出:每个显示控制器负责将接收到的图像数据转换为适合各自连接显示器的标准信号(如 HDMI、MIPI-DSI 等),并同步输出到各个物理屏幕。
显示同步:通过硬件级别的帧同步技术,确保所有屏幕上的画面保持一致,避免不同步导致的视觉差异。
提示
现鲁班猫4的网盘安卓固件上默认开启双屏同显(例如Image-rk3588s_lubancat_4_v1_mipi1080p固件中,已经开启了 双5.5寸1080p屏幕的异屏同显,同时接上dsi0和dsi1即可),固本篇将着重介绍双屏异显
13.3. 多屏异显¶
多屏异显是指在多个屏幕上显示不同内容的功能。在多屏同显的情况下,多屏异显是指在多个屏幕上同时显示不同内容的功能。这使得用户可以根据需求为每个屏幕配置独立的内容,通过APK 可自主显示APK 的内容。
图形生成:应用程序根据每个屏幕的需求生成不同的图像数据。
图像处理:经过渲染后的图像数据通过内部总线传递给相应的显示控制器。
同步输出:每个显示控制器负责将接收到的图像数据转换为适合各自连接显示器的标准信号(如 HDMI、MIPI-DSI 等),并输出到各个物理屏幕。
显示同步:虽然每个屏幕显示的内容不同,但通过硬件级别的帧同步技术,可以确保所有屏幕上的画面保持良好的时间一致性,避免视觉上的不同步问题。
13.4. 多屏异显演示¶
本次演示的设备为鲁班猫4,使用的系统为安卓 12,使用的物理屏幕是 HDMI 和 10.1寸 MIPI 800p 屏幕
13.4.2. Android 上层配置¶
Android 系统上层配置中指定了主屏和副屏,文件路径为device/rockchip/rk3588/rk3588s_lubancat_4_mipi800p/rk3588s_lubancat_4_mipi800p.mk,内容如下

13.4.3. Android APK代码如下¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | // 遍历所有可用的显示屏,并根据每个屏幕的 displayId 来区分主屏和副屏
private void checkAndShowContentOnDisplays() {
Display[] displays = displayManager.getDisplays();
for (Display display : displays) {
int displayId = display.getDisplayId();
Log.d(TAG, "Checking display with id: " + displayId);
if (displayId == 0) { // 主屏
Log.d(TAG, "Found main display with id: " + displayId);
continue;
} else { // 副屏
Log.d(TAG, "Found secondary display with id: " + displayId);
showContentOnSecondaryDisplay(display);
}
}
}
//通过 showContentOnSecondaryDisplay() 方法来显示内容
private void showContentOnSecondaryDisplay(Display display) {
if (secondaryPresentation == null || !secondaryPresentation.getDisplay().equals(display)) {
if (secondaryPresentation != null) {
secondaryPresentation.dismiss();
}
secondaryPresentation = new SecondaryScreenPresentation(this, display);
try {
secondaryPresentation.show();
Log.d(TAG, "Successfully showed content on secondary display.");
} catch (Exception e) {
Log.e(TAG, "Failed to show content on secondary display", e);
}
}
}
|