安卓系统双屏异显_Android 双屏异显实现的三种方式

在各种产品脑洞大开的时代,需求也是日益新异,笔者最近开发了一套双屏异显app。现在做一些总结

1.双屏异显第一种实现方式(官方提供的Presentation)

Android 提供了一个叫 Presentation 类,来实现第二屏, 继承 Presentation 实现第二屏,相当于一个特殊的弹窗窗口(具体实现)

public class DifferentDislay extends Presentation{

public DifferentDislay(Context outerContext, Display display){

super(outerContext,display);

}

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.diffrentdisplay);

}

}

引用:

//双屏显示

DisplayManager mDisplayManager;//屏幕管理类

Display[] displays;//屏幕数组

mDisplayManager =(DisplayManager)MainActivity.this.getSystemService(Context.DISPLAY_SERVICE);

displays =mDisplayManager.getDisplays(); //得到显示器数组

DifferentDislay mPresentation =new DifferentDislay

(getApplicationContext(),displays[1]);//displays[1]是副屏

mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

mPresentation.show();

所需权限:

注:以上是以 Presentation 实现的双屏异显,这种方式比较适合双屏独立操作没有交际的时候,如果存在双屏同显,或者两者之际要有一些数据同步,后比较麻烦,

比如:主屏播放适配 - >投影到第二屏,上面这种方法不适用了,因为涉及到适配同步显示,还有主副屏幕都要启动一个播放器才能实现,性能极大的浪费,设备性能比较好,还可以以这种方式实现,如果设备性能不是很好,使用这种方式后照成视频卡顿,严重者可能解码失败,照成视频无法播放等等一些列并发问题

针对上面开启第二屏 双屏同显,播放视频,我在原来的基础上做了极大的改善,可以避免启动两个播放器,照成性能的浪费

2.双屏异显(同显)实现方式

相信做双屏异显的同胞们,肯定看过来Presentation 的源码 ,源码中显示 Presentation 是继承与 Dialog 来实现的,在文章的开头我也有提到过,第二屏可以看作一个特殊的 Dialog 来实现

在研究Presentation 源码的时候发现它是通过  Window w = getWindow();  来获取了一个窗口,做我们android 开发的都知道 Window是android 顶级窗口,看到这里我在想为何自己不能直接去创建一个窗口然后获取屏幕数组放置在第二屏幕上呢?往下看

public void addPresentation(Context paramContext){

Display display = ((MediaRouter) paramContext.getSystemService(Context.MEDIA_ROUTER_SERVICE)).getSelectedRoute(2).getPresentationDisplay();

this.secondDisplay = display;

if (display != null) {

this.windowManager = (WindowManager) paramContext.createDisplayContext(display).getSystemService(Context.WINDOW_SERVICE);

this.secondDisplayContext = paramContext.createDisplayContext(this.secondDisplay);

return;

}

}

上述代码我们获取窗口管理器,通过paramContext创建了第 paramContext.createDisplayContext(this.secondDisplay);  第二屏幕

创建好第二屏幕以后我们去给第二屏屏幕添加一个view

public View addView(int paramInt){

this.view = View.inflate(this.secondDisplayContext, paramInt, null);

this.layoutParams = new WindowManager.LayoutParams(2003, 3, 3);

if (Build.VERSION.SDK_INT >= 23) {

this.layoutParams.type = 2038;

} else {

this.layoutParams.type = 2003;

}

this.windowManager.addView(this.view, this.layoutParams);

return this.view;

}

这样我们的第二屏幕就已经完成,只需要根据自己的需求创建一个布局,调用addView方法添加进去,把添加进去的view返回出去,在主类中进行操作,就解决了数据数据同步问题

以下是完整代码

public class HelpHandPresentation{

private WindowManager.LayoutParams layoutParams;

private Display secondDisplay;

private Context secondDisplayContext;

private View view;

private WindowManager windowManager;

public void addPresentation(Context paramContext){

Display display = ((MediaRouter) paramContext.getSystemService(Context.MEDIA_ROUTER_SERVICE)).getSelectedRoute(2).getPresentationDisplay();

this.secondDisplay = display;

if (display != null) {

this.windowManager = (WindowManager) paramContext.createDisplayContext(display).getSystemService(Context.WINDOW_SERVICE);

this.secondDisplayContext = paramContext.createDisplayContext(this.secondDisplay);

return;

}

}

public View addView(int paramInt){

this.view = View.inflate(this.secondDisplayContext, paramInt, null);

this.layoutParams = new WindowManager.LayoutParams(2003, 3, 3);

if (Build.VERSION.SDK_INT >= 23) {

this.layoutParams.type = 2038;

} else {

this.layoutParams.type = 2003;

}

this.windowManager.addView(this.view, this.layoutParams);

return this.view;

}

public void presentationAddView(){

this.windowManager.addView(this.view, this.layoutParams);

}

public void removeLayoutView(){

this.windowManager.removeView(this.view);

}

}

相当于一个工具类,只复制到项目里可以直接使用

以下是调用方式

HelpHandPresentation helpHandPresentation = new HelpHandPresentation();

helpHandPresentation.addPresentation(context);

View view = helpHandPresentation.addView(layout);

三行代码即可,调用方便

3.双屏异显还有一种方式是通过 投影来实现的,每次投影都会弹提示框,进行确认,有一定的局限性

(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);

有兴趣的可以看看 MediaProjectionManager 源码实现,这里就在叙述了

完结

这篇文章呢,作为一个开头,后续笔者会针对这一模块 发布一套三方sdk,方便大家使用,节省开发时间

欢迎业界各位同胞提一些好的意见,我会总结归纳,进行梳理,更好的完善sdk的开发进度与工作

有缘留个关注把

文章来源: blog.csdn.net,作者:我居然是个凡人,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/g1998_7_9/article/details/111373249

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hazelcast入门教程_Hazelcast入门指南第5部分

hazelcast入门教程这是我撰写的有关Hazelcast的一系列文章的延续。 我强烈建议您阅读其他内容: 第1 部分 , 第2 部分 , 第3 部分和第4部分 。 一气呵成的东西 这篇文章中没有Hazelcast专用代码。 让我重复一遍。 这篇文章中没有Hazelcast专用…

单片机C语言编程:.H文件与.C文件的关系!

一个.C文件对应一个.H文件是一种良好的编程习惯,那么.C和.H文件之间的关系是怎么样的呢?一、.H文件与.C文件的关系:迄今为止,写过的程序都是一些很简单的程序,从来没有想到要自己写.H文件,也不知道.H文件到…

python编程快速上手-----让繁琐工作自动化_Python编程快速上手让繁琐工作自动化--逗号代码和字符图网格...

逗号代码假定有下面这样的列表:spam [apples, bananas, tofu, cats]编写一个函数,它以一个列表值作为参数,返回一个字符串。该字符串包含所有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入and。例如将前面…

spring依赖注入_Spring的依赖注入陷阱

spring依赖注入Spring框架中有三种注入变量: 基于二传手的注射 基于构造函数的注入 基于现场的注入 这些机制中的每一种都有优点和缺点,并且不仅只有一种正确的方法。 例如现场注入: Autowired private FooBean fooBean;在生产代码中使用…

C语言中的“悬空指针”和“野指针”是什么意思?

提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词:“悬空指针”和“野指针”。1 悬空指针C语言中的指针可以指向一块内存&…

java zip解压_Java语言入门第一课

Java最初的目标是嵌入式设备,不过在嵌入式设备方面并未取得成功。失之东隅,收之桑榆,Java却在Web领域被广泛接受。近年来,随着Java在服务器领域的不断突破,让这门语言越来越流行。有人喜欢Java的纯面向对象&#xff0c…

怎么用c语言做出等妖三角形_初二数学培优,怎么用顶点坐标求三角形面积?割补法这样用很简单...

点击右上角关注“陈老师初中数理化”分享学习经验,一起畅游快乐的学习生活。根据顶点坐标求解三角形的面积是初二数学的重要知识点,本文就例题详细解析这类题型的解题思路,希望能给初二学生的数学学习带来帮助。例题如图,在平面直…

restful xml_使用入站适配器公开HTTP Restful API。 第1部分(XML)

restful xml1.简介 这篇文章的目的是使用Spring Integration HTTP入站适配器实现HTTP Restful API。 本教程分为两个部分: XML配置示例(同一篇文章)。 Java DSL示例。 这将在本教程的下一部分中进行说明,展示如何使用Spring Int…

C语言的位域

位域是什么?有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的…

xp精简工具_办公人士需要精简Win10吗?

首先要说自己的系统需求1,笔记本是主要生产力工具,靠它做方案,联系网络社交;2,会偶尔(一月2-3次)用到PS,AI,PR等软件;3,文件多,版本多…

matlab 删除路径_MATLAB使用教程(一)—新手来看

前言:在这里,本人默认大家已经安装好了MATLAB软件,如果没有,请自行安装。注意事项:新手容易犯错,打开MATLAB之后,请按CTRLQ这个组合键,是不是发现你的MATLAB关闭了?对&am…

数据的gzip压缩解压缩_使用GZIP和压缩数据

数据的gzip压缩解压缩抽象 我们都知道用zip或gzip压缩文件的含义。 但是在Java中使用压缩文件并不像您想的那样简单,特别是如果您不是直接使用文件而是压缩流数据时。 我们会去: 如何将字符串转换为压缩/压缩字节数组,反之亦然 创建用于读取…

C语言开发单片机为啥都是全局变量形式?

01前言全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是:1. 做控制的工程师;2. 做非嵌入式的软件工程师。02做控制的工程师特点他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非常有名的做控制实验室里出来的PhD/Master&a…

ajax get请求_python测试开发django50.jquery发送Ajax请求(get)

前言有时候,我们希望点击页面上的某个按钮后,不刷新整个页面,给后台发送一个请求过去,请求到数据后填充到html上,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。Ajax可以完美的实现。…

primefaces_PrimeFaces Mobile入门

primefaces介绍 如果您已经开发了利用PrimeFaces的应用程序,或者打算开发可在台式机和移动设备上使用的Web应用程序,请考虑将PrimeFaces Mobile用于您的移动实施。 这篇博客文章将介绍一些基础知识,以帮助您开始为现有的PrimeFaces应用程序开…

C语言指针这些使用技巧值得收藏!

指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽。比如JAVA,java是没有指针的,但是很多地方都用到指针,不过不对用户开放,…

如何用python实现地图定位_基于 PyQt5 实现地图中定位相片拍摄位置

项目简介:本次项目主要学习了如何查找相片中的 Exif 信息,并通过 Exif 信息中的 GPS 数据在百度地图中进行定位标点,以确定相片的拍摄地点。本次实验的目的旨在通过包含 GPS 信息的相片进行取证调查,当然个人娱乐也可以&#xff0…

mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义

在一开始接触MySQL数据库时,对于int(M)及tinyint(M)两者数值类型后面的M值理解是最多能够插入数据库中的值不能大于M;后来工作后,也是一边学习一边使用,之后的理解是其中的M的意思是插入数据库中的值的字符长度不能大于M&#xff…

arquillian_使用Arquillian测试安全的EJB

arquillian从历史上讲,很难测试安全的EJB。 到目前为止,我一直在使用专有技术(如JBossLoginContextFactory)中所述的文章( 使用Arquillian在WildFly 8.1.x上测试安全的EJB)来测试安全的EJB。 在今年Devoxx…

api怎么写_使用Node.js原生API写一个web服务器

Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点。一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa。但是Express和Koa都是对Node.js原生API的封装,所以其实不…