Android Graphics 多屏同显/异显 - C++示例程序(标准版)
”为了理解Android多屏同显/异显的基本原理,我们将从Native Level入手,基于Graphics APIs写作一个简单的C++版本的多屏显示互动的演示程序。通过这个程序我们将了解常用的多屏显示相关的接口的使用方法。“
01
多屏显示C++示例概况
源码下载
请查看文章末尾源码下载方式。

源码编译
本demo程序是基于Android S源码环境开发的,所以需要放到Android S源码下编译。
将上一步中下载的源码放到Android源码的合适目录下,比如我放到了android/device/multi-display-demo目录下,然后执行mm进行编译,得到可执行档 MultiDisplayDemo
源码运行
运行前,需要先有一个多屏幕的环境,我们采用前面文章提到的方式,搭建模拟环境:虚拟设备具有2块1080x1920的物理屏幕
Android Graphics 显示系统 - 如何模拟多(物理)显示屏?
启动模拟环境时,设定display参数,如下
--display0=width=1080,height=1920 --display1=width=1080,height=1920
注意:
一定要在开发者选项里打开Force desktop mode,我们需要有一个多屏异显的系统环境!!

将可执行档MultiDisplayDemo放到目标测试平台/system/bin下(比如:adb push MultiDisplayDemo /system/bin/)
查看使用说明
# adb shell MultiDisplayDemo -h
usage: MultiDisplayDemo [options]
----------------------------------------------------------------------------------
[-h] help
[-l] list displays
[-d] layer stack(In case of multi-display, show surface on the specified displays)
When demo is running, you can input a char to control surface
n: move surface to other display with no animation
m: move surface to other display with animation
s: show surface on diffrent displays
----------------------------------------------------------------------------------
至此你已经收获一个可以供后续学习研究的demo小程序了 !!!
02
多屏显示C++示例功能说明
# adb shell MultiDisplayDemo -l
Display Devices: size=2
#0 display layerStack=0 activeMode={ 1080x1920@60.00fps }
#1 display layerStack=2 activeMode={ 1080x1920@60.00fps }
可以看到当前设备有几块屏幕,每个屏幕当前的分辨率、刷新率,还有一个关键的信息layerStack。
adb shell MultiDisplayDemo -d 2
动态切换画面到另一块屏幕
程序运行过程中,输入‘n’,按回车键,可以动态切换画面所在的屏幕,效果如下图

移动画面到另一块屏幕
程序运行过程中,输入‘m’,按回车键,可以动态的移动画面到另一块屏幕,这个过程中会有一个过渡动画的效果,移动过程中画面会同时显示到两个屏幕上,两块屏幕上的内容拼成完整画面,直到画面全部移动到另一块屏幕上去,效果如下图:


多屏同显
程序运行过程中,输入‘s’,按回车键,可以将画面同时显示在多个屏幕上,模拟多屏同显的效果,如下

退出
程序运行过程中,输入‘q’,按回车键 或者 Ctrl+C 可以终止程序执行。
03
多屏显示dumpsys信息解读
本篇先不着急分析源码,在多屏幕显示的场景下,我们需要知道一些基本的命令来查看当前Display和Layer的信息,主要就是两个命令:
1. dumpsys SurfaceFlinger // 可以查看display和layer信息
2. dumpsys display // 查看display信息
重点是要懂得通过dumpsys SurfaceFlinger查看layer的信息:
重点是要懂得通过dumpsys SurfaceFlinger查看layer的信息:
layer显示到哪一个display上?
layer显示的位置、z-order?
layer的大小size?
layer是否有被裁剪crop?
关注公众号阅读剩余内容,获取示例源码!
Android Graphics 多屏同显/异显 - C++示例程序(标准版)的更多相关文章
- RK3288 双屏异显,两屏默认方向不一致
CPU:RK3288 系统:Android 5.1 RK3288 支持双屏异显,一般都会同方向显示,如果遇到两个 lcd 的默认方向不一致,只需修改下面参数即可. 例如:主屏为mipi接口,分辨率为 ...
- Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .
有了前面关于Android OpenGL ES的介绍,可以开始创建示例程序OpenGLDemos. 使用Eclipse 创建一个Android项目 Project Name: OpenGLDemos ...
- RK3288 6.0 双屏异显,横屏+竖屏【转】
本文转载自:http://blog.csdn.net/clx44551/article/details/78215730?locationNum=8&fps=1 RK3288 6.0 双屏异显 ...
- iTOP-iMX6开发板Android系统下LVDS和HDMI双屏异显方法
迅为iMX6 开发板 android 系统下 LVDS 和 HDMI 双屏异显的使用过程. 注意,iTOP-iMX6 开发板的 android 系统想要实现对 LVDS 和 HDMI 双屏异显功能的支 ...
- RK3288 增加双屏异显 eDP+LVDS
CPU:RK3288 系统:Android 5.1 下面是官方文档中的信息. 1.rk3288 支持的显示接口可以任意组合. 2.双屏异显时,一个显示接口当主屏,另一个当副屏:主副屏由板级 dts 文 ...
- Rk3288 双屏异显单触摸
系统版本:RK3288 android 5.1 设备同时有两个lcd,主屏是mipi接口,带有触摸屏,触摸屏是usb接口,副屏是hdmi接口,没有触摸屏,正常情况下,两个lcd显示相同内容,触摸屏一切 ...
- RK3288 双屏异显时,触摸屏(USB接口)无反应
系统版本:RK3288 android 5.1 设备同时有两个lcd,主屏是mipi接口,带有触摸屏,触摸屏是usb接口,副屏是hdmi接口,没有触摸屏,正常情况下,两个lcd显示相同内容,触摸屏一切 ...
- 【ARM开发板】迅为IMX6开发板QT下LVDS和HDMI双屏异显
本文转自迅为论坛:http://www.topeetboard.com 平台:迅为-IMX6开发板 首先开发板分别连接9.7寸屏和HDMI显示器,然后使用MfgTool工具烧写QT系统,然后拨码开关设 ...
- [Android6.0][RK3399] 双屏异显代码实现流程分析(一)【转】
本文转载自:http://blog.csdn.net/dearsq/article/details/55049182 Platform: RK3399 OS: Android 6.0 Version: ...
- iTOP-4418/6818开发板支持双屏异显,双屏同显
iTOP-4418/6818开发板平台安卓系统下支持双屏异显,双屏同显,客户可按照不同用途,分别播放适合屏幕显示方式的内容 ,如HDMI屏幕和LCD屏幕显示不同内容, 一个屏幕播放广告,另一个屏幕运行 ...
随机推荐
- docker开发
Docker docker介绍 Docker是一个客户端-服务器(C/S)架构程序.本质上是通过go语言对lxc技术的一个封装,遵守Restful规范 docker hub注册一个账号(用来拉取镜像) ...
- 使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力
文章信息 标题:使用C#和MemoryCache组件实现轮流调用API Key以提高并发能力的技巧 摘要:本文介绍了如何利用C#语言中的MemoryCache组件,结合并发编程技巧,实现轮流调用多个A ...
- ansible 自动化运维(1)
ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量 ...
- MinGW编译Python至pyd踩坑整理
不需要安装VS工具,pyd使用说明. 用scoop自动安装配置MinGw 需要魔法,用包管理scoop安装不需要手动配置.这一步可以自行下载mingw64然后手动配置. scoop install m ...
- C++学习笔记之基础语法
目录 基础语法 switch和if区别 枚举定义及作用域 结构体数据耐齐--缺省对齐原则 函数重载overload与C++Name Mangling 指向函数的指针与返回指针的函数 基础语法 swit ...
- etcd每个节点都存储了完整的键值对数据集,为什么扩容etcd集群仍可分散存储压力?
etcd每个节点都存储了完整的键值对数据集,这主要是为了确保数据的一致性和高可用性.在这种设计下,任何一个节点都可以处理读取请求,并在本地提供数据,从而无需跨节点通信.这种冗余的数据存储方式也增加了系 ...
- Android 桌面小组件使用
原文: Android 桌面小组件使用-Stars-One的杂货小窝 借助公司上的几个项目,算是学习了Android桌面小组件的用法,记下踩坑记录 基本步骤 1.创建小组件布局 这里需要注意的事,小组 ...
- C#事件(event)的理解
一.多播委托的应用--观察者模式 遇到一个开发的问题? 面试者:以面向对象的思想实现一下的场景: 猫:Miao一声,紧接着引发了一系列的行为~ Miao:引发了一系列的动作: 从代码层面来说:代码这样 ...
- day02-自己实现Mybatis底层机制-01
自己实现Mybatis底层机制-01 主要实现:封装SqlSession到执行器+Mapper接口和Mapper.xml+MapperBean+动态代理Mapper的方法 1.Mybatis整体架构分 ...
- eclipse错误之Unhandled event loop exception PermGen space
原来一直用eclipse3.5,最近尝试升级到3.7和4.2,但不管是3.7还是4.2项目编译过程中总提示"Unhandled event loop exception PermGen sp ...