android_TwoScreen
来源:互联网 发布:ruijie校园网络拓扑图 编辑:程序博客网 时间:2024/06/10 03:21
Android实现双屏异显
note:原理部分有参考一个叫撒哈拉的绿洲的blog,代码部分是在同事找的代码基础上进行的二次开发。
主要类:Presentation、DisplayManager、Display
1.如何获取设备上的屏幕?
DisplayManager mDisplayManager;//屏幕管理类
Display[] displays;//屏幕数组
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
displays =mDisplayManager.getDisplays();
2.主屏和副屏的区分?
主屏:displays[0]
副屏:displays[1]
3.如何在副屏上展示内容?
通过Presentation来实现,Presentation继承了Dialog。假设我们写了一个DifferentDislay的类,这个类是要继承
Presentation类的。代码:
privateclass DifferentDislayextendsPresentation{
public DifferentDislay(ContextouterContext, Displaydisplay) {
super(outerContext,display);
//TODOAuto-generated constructor stub
}
@Override
protectedvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diffrentdisplay_basket);
}
}
4.开启副屏
DifferentDislay mPresentation =new DifferentDislay (context,displays[1]);//displays[1]是副屏
mPresentation.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mPresentation.show();
MainActivity.java代码片段如下:
package com.example.display;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity{ private Button btn_open_vice_dispaly; private Button btn_close_vice_dispaly; private ViceDisplay mViceDisplay;//副屏@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);InitView();CleanViceView();}private void CleanViceView(){btn_close_vice_dispaly=(Button)findViewById(R.id.btn_close_vice_dispaly);btn_close_vice_dispaly.setOnClickListener(onClickListener);}private void InitView(){btn_open_vice_dispaly=(Button)findViewById(R.id.btn_open_vice_dispaly);btn_open_vice_dispaly.setOnClickListener(onClickListener);}OnClickListener onClickListener = new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubswitch(arg0.getId()){case R.id.btn_open_vice_dispaly:mViceDisplay = new ViceDisplay(MainActivity.this);mViceDisplay.Show();break;case R.id.btn_close_vice_dispaly:mViceDisplay.Close();break;}}};}
ViceDisplay.java代码如下:package com.example.display;import android.app.Presentation;import android.content.Context;import android.content.DialogInterface;import android.content.res.Resources;import android.hardware.display.DisplayManager;import android.os.Bundle;import android.view.Display;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.view.View.OnClickListener;/** * 下单异屏显示 * */public class ViceDisplay{private DisplayManager mDisplayManager;//屏幕管理类private ViceDisplayPresentation mPresentation;private Display[] displays;//屏幕数组, 主屏:displays[0], 副屏:displays[1]public ViceDisplay(Context context){mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);displays = mDisplayManager.getDisplays();//Gets all currently valid logical displays,得到当前所有有效的逻辑显示。return an array containing all displaysif (displays.length<2) {//单屏mPresentation = new ViceDisplayPresentation(context, displays[0]);//怎么对应的是副屏的layout????}else {//双屏mPresentation = new ViceDisplayPresentation(context, displays[1]);}//需要权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>//.开启副屏mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);mPresentation.setOnDismissListener(mOnDismissListener);}/**开启异显*/public void Show(){try {mPresentation.show();} catch (Exception ex) {mPresentation = null;}}public void Close() {try {mPresentation.dismiss();//dialog.dismiss() : 取消对话框 } catch (Exception ex) {mPresentation = null;}}private final DialogInterface.OnDismissListener mOnDismissListener = new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {if (dialog == mPresentation) {mPresentation.dismiss();mPresentation = null;}}};/* * * 如何在副屏上展示内容? * 要为辅助显示屏创建独特的内容: * 1. 您需要扩展Presentation类,并实现onCreate()回调方法。在onCreate()中,调用setContentView()来指定您要在辅助显示屏上显示的UI。 * 2. 作为Dialog类的扩展,Presentation类提供了一个区域,在其中,您的应用可以在辅助显示屏上显示不同的UI。 *///Presentation应用在辅助显示器上(副屏)显示不同的内容程序,以有线或Wi-Fi将外接显示输出连接到用户设备上,显示独特的内容。private class ViceDisplayPresentation extends Presentation implements android.view.View.OnClickListener{public ViceDisplayPresentation(Context outerContext, Display display) {super(outerContext, display);// TODO Auto-generated constructor stub}private Button btn;private Button return1;@Overridepublic Display getDisplay() {// TODO Auto-generated method stubreturn super.getDisplay();}@Overridepublic Resources getResources() {// TODO Auto-generated method stubreturn super.getResources();}/* * * @see android.app.Presentation#onDisplayChanged() */@Overridepublic void onDisplayChanged() {// TODO Auto-generated method stubsuper.onDisplayChanged();setContentView(R.layout.vice_display_next);return1=(Button)findViewById(R.id.return1);return1.setOnClickListener(this);}@Overridepublic void onDisplayRemoved() {// TODO Auto-generated method stubsuper.onDisplayRemoved();}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();}@Overridepublic void show() {// TODO Auto-generated method stubsuper.show();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.vice_display);btn=(Button)findViewById(R.id.test);btn.setOnClickListener(this);}@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubswitch(arg0.getId()){case R.id.test://Close();onDisplayChanged();break;case R.id.return1://onDisplayChanged();Close();break;}} }}
其中AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.display" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
res--->layout---->activity_main.xml
主要类:Presentation、DisplayManager、Display
1.如何获取设备上的屏幕?
DisplayManager mDisplayManager;//屏幕管理类
Display[] displays;//屏幕数组
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
displays =mDisplayManager.getDisplays();
2.主屏和副屏的区分?
主屏:displays[0]
副屏:displays[1]
3.如何在副屏上展示内容?
通过Presentation来实现,Presentation继承了Dialog。假设我们写了一个DifferentDislay的类,这个类是要继承
Presentation类的。代码:
privateclass DifferentDislayextendsPresentation{
public DifferentDislay(ContextouterContext, Displaydisplay) {
super(outerContext,display);
//TODOAuto-generated constructor stub
}
@Override
protectedvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diffrentdisplay_basket);
}
}
4.开启副屏
DifferentDislay mPresentation =new DifferentDislay (context,displays[1]);//displays[1]是副屏
mPresentation.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mPresentation.show();
MainActivity.java代码片段如下:
package com.example.display;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity{ private Button btn_open_vice_dispaly; private Button btn_close_vice_dispaly; private ViceDisplay mViceDisplay;//副屏@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);InitView();CleanViceView();}private void CleanViceView(){btn_close_vice_dispaly=(Button)findViewById(R.id.btn_close_vice_dispaly);btn_close_vice_dispaly.setOnClickListener(onClickListener);}private void InitView(){btn_open_vice_dispaly=(Button)findViewById(R.id.btn_open_vice_dispaly);btn_open_vice_dispaly.setOnClickListener(onClickListener);}OnClickListener onClickListener = new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubswitch(arg0.getId()){case R.id.btn_open_vice_dispaly:mViceDisplay = new ViceDisplay(MainActivity.this);mViceDisplay.Show();break;case R.id.btn_close_vice_dispaly:mViceDisplay.Close();break;}}};}
ViceDisplay.java代码如下:package com.example.display;import android.app.Presentation;import android.content.Context;import android.content.DialogInterface;import android.content.res.Resources;import android.hardware.display.DisplayManager;import android.os.Bundle;import android.view.Display;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.view.View.OnClickListener;/** * 下单异屏显示 * */public class ViceDisplay{private DisplayManager mDisplayManager;//屏幕管理类private ViceDisplayPresentation mPresentation;private Display[] displays;//屏幕数组, 主屏:displays[0], 副屏:displays[1]public ViceDisplay(Context context){mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);displays = mDisplayManager.getDisplays();//Gets all currently valid logical displays,得到当前所有有效的逻辑显示。return an array containing all displaysif (displays.length<2) {//单屏mPresentation = new ViceDisplayPresentation(context, displays[0]);//怎么对应的是副屏的layout????}else {//双屏mPresentation = new ViceDisplayPresentation(context, displays[1]);}//需要权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>//.开启副屏mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);mPresentation.setOnDismissListener(mOnDismissListener);}/**开启异显*/public void Show(){try {mPresentation.show();} catch (Exception ex) {mPresentation = null;}}public void Close() {try {mPresentation.dismiss();//dialog.dismiss() : 取消对话框 } catch (Exception ex) {mPresentation = null;}}private final DialogInterface.OnDismissListener mOnDismissListener = new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {if (dialog == mPresentation) {mPresentation.dismiss();mPresentation = null;}}};/* * * 如何在副屏上展示内容? * 要为辅助显示屏创建独特的内容: * 1. 您需要扩展Presentation类,并实现onCreate()回调方法。在onCreate()中,调用setContentView()来指定您要在辅助显示屏上显示的UI。 * 2. 作为Dialog类的扩展,Presentation类提供了一个区域,在其中,您的应用可以在辅助显示屏上显示不同的UI。 *///Presentation应用在辅助显示器上(副屏)显示不同的内容程序,以有线或Wi-Fi将外接显示输出连接到用户设备上,显示独特的内容。private class ViceDisplayPresentation extends Presentation implements android.view.View.OnClickListener{public ViceDisplayPresentation(Context outerContext, Display display) {super(outerContext, display);// TODO Auto-generated constructor stub}private Button btn;private Button return1;@Overridepublic Display getDisplay() {// TODO Auto-generated method stubreturn super.getDisplay();}@Overridepublic Resources getResources() {// TODO Auto-generated method stubreturn super.getResources();}/* * * @see android.app.Presentation#onDisplayChanged() */@Overridepublic void onDisplayChanged() {// TODO Auto-generated method stubsuper.onDisplayChanged();setContentView(R.layout.vice_display_next);return1=(Button)findViewById(R.id.return1);return1.setOnClickListener(this);}@Overridepublic void onDisplayRemoved() {// TODO Auto-generated method stubsuper.onDisplayRemoved();}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();}@Overridepublic void show() {// TODO Auto-generated method stubsuper.show();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.vice_display);btn=(Button)findViewById(R.id.test);btn.setOnClickListener(this);}@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubswitch(arg0.getId()){case R.id.test://Close();onDisplayChanged();break;case R.id.return1://onDisplayChanged();Close();break;}} }}
其中AndroidManifest.xml如下: