双屏显示方法及其***、计算机可读存储介质
技术领域
本发明涉及双屏显示技术领域,尤其涉及一种基于Android***的双屏显示方法及其***、计算机可读存储介质。
背景技术
利用安卓提供的Presentation接口我们可以实现双屏异显功能,比如在典型的KTV应用中,可以在点歌屏上显示点歌界面,在电视上显示MTV画面。但如果想在点歌屏上的部分或全部区域同时显示电视上的画面,尤其是视频画面,目前还没有直接的接口可以使用。
由于Android***的多媒体框架、显示框架的限制,无法方便的实现Surface(应用程序最终可见的、可维护的图形图像显示内容,即层)内容直接复制,而从一个Surface读取内容再写入另外一个Surface效率比较低。如果想在两个屏幕上显示相同画面的内容,通常需要在两个屏幕上分别绘制一遍,在画面复杂时,比如使用OpenGL绘图时,需要两个屏幕均重新执行一遍绘制操作,代码编写起来比较复杂并且是两倍的图形资源消耗,而如果想在两个屏幕上显示同一个视频画面,通常需要同步播放两个视频,然而这种方法需要定制播放器实现两个播放器同步播放,并且解码资源、图形资源的消耗也是两倍。更进一步的如果需要实现将一个屏幕的画面内容显示在另一个屏幕上,则会引入更复杂的代码结构。而如果使用Surface读取再写入的方式,效率较低无法达到流畅显示的要求。
而在Android5.0之后的***中,引入了MediaProjection接口,可以通过VirtualDisplay屏幕镜像的方式,方便高效地获取到主屏幕的Surface数据,将数据重导入目标Surface进行渲染后,就可以实现屏幕复制或屏幕录制的功能。但这种方式的限制是只能对主屏幕的内容进行镜像,且无法只显示部分图层的内容。
发明内容
本发明所要解决的技术问题是:提供一种基于Android***的双屏显示方法及其***、计算机可读存储介质,可将一个屏幕的全部内容或部分内容显示在另一个屏幕上。
为了解决上述技术问题,本发明采用的技术方案为:一种基于Android***的双屏显示方法,包括:
在第一屏幕的预设区域上创建虚拟屏幕;
将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈;
获取所述虚拟屏幕的显示堆栈中预设的图层;
将所述预设的图层显示在虚拟屏幕上。
本发明还涉及一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有多条指令,所述指令适于由处理器加载并执行:
在第一屏幕的预设区域上创建虚拟屏幕;
将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈;
获取所述虚拟屏幕的显示堆栈中预设的图层;
将所述预设的图层显示在虚拟屏幕上。
本发明还涉及一种基于Android***的双屏显示***,包括处理器,适于执行各指令;以及计算机可读存储介质,适于存储多条指令,所述指令适于由处理器加载并执行:
在第一屏幕的预设区域上创建虚拟屏幕;
将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈;
获取所述虚拟屏幕的显示堆栈中预设的图层;
将所述预设的图层显示在虚拟屏幕上。
本发明的有益效果在于:利用Android***的虚拟屏幕机制,在第一屏幕上创建虚拟屏幕,利用Android显示框架中的显示堆栈机制,通过共享内存数据的方式镜像第二屏幕的屏幕数据,避免Surface的复制过程,降低资源消耗;本发明可在双屏异显的情况下,将一个屏幕的全部图层或部分图层显示在另一个屏幕上的全部区域或部分区域。
附图说明
图1为本发明一种基于Android***的双屏显示方法的流程图;
图2为本发明实施例一的方法流程图;
图3为本发明实施例三的***结构示意图。
标号说明:
1、处理器;2、计算机可读存储介质。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图详予说明。
本发明最关键的构思在于:在第一屏幕上创建虚拟屏幕,并让虚拟屏幕与第二屏幕共享缓存数据。
请参阅图1,一种基于Android***的双屏显示方法,包括:
在第一屏幕的预设区域上创建虚拟屏幕;
将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈;
获取所述虚拟屏幕的显示堆栈中预设的图层;
将所述预设的图层显示在虚拟屏幕上。
从上述描述可知,本发明的有益效果在于:可在双屏异显的情况下,将一个屏幕的全部图层或部分图层显示在另一个屏幕上的全部区域或部分区域。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之前,进一步包括:
判断是否存在第二屏幕;
若存在,则执行所述将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈的步骤;
若不存在,则将所述虚拟屏幕的显示堆栈设定为第一屏幕的显示堆栈;
继续执行所述判断是否存在第二屏幕的步骤。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之后,进一步包括:
若第二屏幕的显示堆栈发生变更,则相应地变更所述虚拟屏幕的显示堆栈。
由上述描述可知,通过监视屏幕的创建/销毁/变更事件,同步更新虚拟屏幕的信息。
进一步地,所述“获取所述虚拟屏幕的显示堆栈中预设的图层”具体为:
根据图层的标识,在所述虚拟屏幕的显示堆栈中过滤得到预设的图层,所述图层的标识为图层顺序或图层名称;
若所述预设的图层的数目为两个以上,则合成所述预设的图层。
由上述描述可知,一个屏幕的显示堆栈中存储有多个图层,这多个图层显示时是有叠加顺序的,例如视频图像层在最底层,字幕层在视频图像层之上,因此可以通过图层的顺序对多个图层进行过滤,获得所需要的图层,也可以通过图层的名字进行过滤,根据图层的名字获得所需要的图层,这样即可根据需求,将不需要显示在虚拟屏幕上的图层过滤移除,将需要显示在虚拟屏幕上的图层进行合成。
进一步地,所述“在第一屏幕的预设区域上创建虚拟屏幕”具体为:
通过createVirtualDisplay()接口或OverlayDisplay创建虚拟屏幕;
将所述虚拟屏幕的渲染目标设置在第一屏幕中的预设区域。
本发明还提出一种计算机可读存储介质2,所述计算机可读存储介质中存储有多条指令,所述指令适于由处理器加载并执行:
在第一屏幕的预设区域上创建虚拟屏幕;
将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈;
获取所述虚拟屏幕的显示堆栈中预设的图层;
将所述预设的图层显示在虚拟屏幕上。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之前,进一步包括:
判断是否存在第二屏幕;
若存在,则执行所述将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈的步骤;
若不存在,则将所述虚拟屏幕的显示堆栈设定为第一屏幕的显示堆栈;
继续执行所述判断是否存在第二屏幕的步骤。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之后,进一步包括:
若第二屏幕的显示堆栈发生变更,则相应地变更所述虚拟屏幕的显示堆栈。
进一步地,所述“获取所述虚拟屏幕的显示堆栈中预设的图层”具体为:
根据图层的标识,在所述虚拟屏幕的显示堆栈中过滤得到预设的图层,所述图层的标识为图层顺序或图层名称;
若所述预设的图层的数目为两个以上,则合成所述预设的图层。
进一步地,所述“在第一屏幕的预设区域上创建虚拟屏幕”具体为:
通过createVirtualDisplay()接口或OverlayDisplay创建虚拟屏幕;
将所述虚拟屏幕的渲染目标设置在第一屏幕中的预设区域。
本发明还提出一种基于Android***的双屏显示***,包括处理器,适于执行各指令;以及计算机可读存储介质,适于存储多条指令,所述指令适于由处理器加载并执行:
在第一屏幕的预设区域上创建虚拟屏幕;
将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈;
获取所述虚拟屏幕的显示堆栈中预设的图层;
将所述预设的图层显示在虚拟屏幕上。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之前,进一步包括:
判断是否存在第二屏幕;
若存在,则执行所述将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈的步骤;
若不存在,则将所述虚拟屏幕的显示堆栈设定为第一屏幕的显示堆栈;
继续执行所述判断是否存在第二屏幕的步骤。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之后,进一步包括:
若第二屏幕的显示堆栈发生变更,则相应地变更所述虚拟屏幕的显示堆栈。
进一步地,所述“获取所述虚拟屏幕的显示堆栈中预设的图层”具体为:
根据图层的标识,在所述虚拟屏幕的显示堆栈中过滤得到预设的图层,所述图层的标识为图层顺序或图层名称;
若所述预设的图层的数目为两个以上,则合成所述预设的图层。
进一步地,所述“在第一屏幕的预设区域上创建虚拟屏幕”具体为:
通过createVirtualDisplay()接口或OverlayDisplay创建虚拟屏幕;
将所述虚拟屏幕的渲染目标设置在第一屏幕中的预设区域。
实施例一
请参照图2,本发明的实施例一为:一种基于Android***的双屏显示方法,可将第二屏幕的全部图层或部分图层显示在第一屏幕上的预设区域,包括如下步骤:
S1:在第一屏幕的预设区域上创建虚拟屏幕;具体地,通过Android***的createVirtualDisplay()接口或OverlayDisplay创建虚拟屏幕,然后将所述虚拟屏幕的渲染目标设置在第一屏幕中的预设区域。
S2:判断是否存在第二屏幕,若是,则执行步骤S3,若否,则执行步骤S4。
S3:将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈,再执行步骤S5;进一步地,若第二屏幕的显示堆栈发生变更,则相应地变更所述虚拟屏幕的显示堆栈。
S4:将所述虚拟屏幕的显示堆栈设定为第一屏幕的显示堆栈;执行步骤S2。同理,若第一屏幕的显示堆栈发生变更,也相应地变更所述虚拟屏幕的显示堆栈。
S5:获取所述虚拟屏幕的显示堆栈中预设的图层;即根据实际需求,获取需要显示在虚拟屏幕上的图层;具体地,根据图层的标识,在所述虚拟屏幕的显示堆栈中过滤得到预设的图层,所述图层的标识为图层顺序或图层名称;若所述预设的图层的数目为两个以上,则合成所述预设的图层。
S6:将所述预设的图层显示在虚拟屏幕上;即若预设的图层的数目只有一个,则直接输出给底层显示驱动进行输出显示,若预设的图层的数目有两个以上,则将合成后的图层数据输出给底层显示驱动进行输出显示。
优选地,在步骤S1之后,分别为第一屏幕、第二屏幕以及所述虚拟屏幕设置唯一标识符,例如,分别为每个屏幕设置不同的名称,通过名称对屏幕进行唯一性判断,确保后续可以使用屏幕名称作为屏幕识别的标记。
其中,对于步骤S2-S4,即在堆栈数据的接收处理服务(Android***中的surfaceflinger服务)中,监视屏幕的创建/销毁/变更事件,并同步更新虚拟屏幕的信息;在本实施例中,第二屏幕的设定优先级高于第一屏幕,也就是说,只要当第二屏幕存在时,就将虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈。
进一步地,当有新的屏幕创建时,需要判断新创建的屏幕是否为第二屏幕,如果是,需要将虚拟屏幕的显示堆栈(layerstack)设为与第二屏幕相同;当有屏幕销毁事件时,需要判断被销毁的屏幕是否为第二屏幕,如果是,需要将虚拟屏幕的显示堆栈设为与第一屏幕相同。对于屏幕的变更事件,当有屏幕变更事件时,需要判断与虚拟屏幕的显示堆栈对应的显示堆栈是否发生变更,如果是,则需要相应地变更虚拟屏幕的显示堆栈。
进一步地,在步骤S4之后,可如图2所示直接执行步骤S2,也可先执行步骤S5-S6后再执行步骤S2。若为前者,则当需要在第一屏幕的预设区域上显示其他图层内容时,只会显示第二屏幕的图层内容;若为后者,则当需要在第一屏幕的预设区域上显示其他图层内容时,若第二屏幕还不存在(如还未创建第二屏幕),则第一屏幕上对应虚拟屏幕的预设区域会先显示第一屏幕的图层内容,即实现画中画的效果,当第二屏幕存在后,则第一屏幕的预设区域上切换显示第二屏幕的图层内容。
本实施例中的第一屏幕为物理屏幕,第二屏幕并不限于物理屏幕,也可以是其他的虚拟屏幕。例如,假设在物理屏幕B上同时存在两个虚拟屏幕D和E,用来分别显示视频内容以及游戏内容,而期望在屏幕A上显示屏幕B上的视频内容,就可以通过指定镜像目标屏幕,即第二屏幕为虚拟屏幕D,将视频内容投射到屏幕A上。
本实施例利用Android***的虚拟屏幕机制,在第一屏幕上创建虚拟屏幕,利用Android显示框架中的显示堆栈机制,通过共享内存数据的方式镜像第二屏幕的屏幕数据,避免Surface的复制过程,降低资源消耗;可在双屏异显的情况下,将一个屏幕的全部图层或部分图层显示在另一个屏幕上的全部区域或部分区域。
实施例二
本实施例是上述实施例的具体应用场景。
假设屏幕A(第一屏幕)是点歌屏,屏幕B(第二屏幕)是电视屏,而屏幕C(虚拟屏幕)就是显示在点歌屏A上的一个窗口,窗口的大小可根据用户需求设置,本实施例的两种应用场景如下:
1、电视屏B上目前有一半在显示一个歌曲MV的内容,另一半在显示一个游戏的内容;这时候可以设定在屏幕C上只同步显示电视屏B上的歌曲MV内容,或者只显示游戏的内容,或者完全显示电视屏B的内容,而具体要在屏幕C上显示什么内容,可由点歌应用在开启屏幕C前设置到***中。
2、电视屏B上在播放MV的内容,同时有叠加显示走马灯、微信二维码等,同样地,在屏幕C上可以指定只显示MV,而不显示走马灯等;进一步地,UI显示的图层在Z方向上是有顺序的,即MV、走马灯、二维码在Z方向上是按顺序排列的,可以利用这个顺序对图层进行过滤,也可以使用图层的名字进行过滤;若利用图层顺序进行过滤,此时,视频图层就位于Z方向上的底层,而走马灯图层、二维码图层就位于Z方向上的上层,通过将Z[0]以上的图层全部过滤移除,就可以实现在屏幕C上只显示屏幕B上的视频内容。
实施例三
请参照图3,本实施例是对应上述实施例的一种基于Android***的双屏显示***,包括处理器1和计算机可读存储介质2;所述处理器1适于执行各指令,所述计算机可读存储介质2适于存储多条指令,所述指令适于由处理器加载并执行:
在第一屏幕的预设区域上创建虚拟屏幕;
将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈;
获取所述虚拟屏幕的显示堆栈中预设的图层;
将所述预设的图层显示在虚拟屏幕上。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之前,进一步包括:
判断是否存在第二屏幕;
若存在,则执行所述将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈的步骤;
若不存在,则将所述虚拟屏幕的显示堆栈设定为第一屏幕的显示堆栈;
继续执行所述判断是否存在第二屏幕的步骤。
进一步地,所述“将所述虚拟屏幕的显示堆栈设定为第二屏幕的显示堆栈”之后,进一步包括:
若第二屏幕的显示堆栈发生变更,则相应地变更所述虚拟屏幕的显示堆栈。
进一步地,所述“获取所述虚拟屏幕的显示堆栈中预设的图层”具体为:
根据图层的标识,在所述虚拟屏幕的显示堆栈中过滤得到预设的图层,所述图层的标识为图层顺序或图层名称;
若所述预设的图层的数目为两个以上,则合成所述预设的图层。
进一步地,所述“在第一屏幕的预设区域上创建虚拟屏幕”具体为:
通过createVirtualDisplay()接口或OverlayDisplay创建虚拟屏幕;
将所述虚拟屏幕的渲染目标设置在第一屏幕中的预设区域。
综上所述,本发明提供的一种基于Android***的双屏显示方法及其***、计算机可读存储介质,利用Android***的虚拟屏幕机制,在第一屏幕上创建虚拟屏幕,利用Android显示框架中的显示堆栈机制,通过共享内存数据的方式镜像第二屏幕的屏幕数据,避免Surface的复制过程,降低资源消耗;本发明可在双屏异显的情况下,将一个屏幕的全部图层或部分图层显示在另一个屏幕上的全部区域或部分区域。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。