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

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"     android:gravity="center_horizontal"    android:orientation="vertical">    <Button        android:id="@+id/btn_open_vice_dispaly"        android:layout_width="match_parent"        android:layout_height="50dp"        android:text="@string/open_vice_dispaly" >    </Button>     <Button        android:id="@+id/btn_close_vice_dispaly"        android:layout_width="match_parent"        android:layout_height="50dp"        android:text="@string/close_vice_dispaly" >    </Button></LinearLayout>
res--->layout--->vice_display_next.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical" >    <TextView        android:layout_width="match_parent"        android:layout_height="60dp"        android:gravity="center"        android:text="@string/vice_dispaly_next"        android:textSize="20sp">    </TextView>    <Button         android:layout_width="match_parent"        android:layout_height="60dp"        android:id="@+id/return1"        android:text="@string/return1"        /></LinearLayout>
res--->layout---->vice_display.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical" >    <TextView        android:layout_width="match_parent"        android:layout_height="60dp"        android:gravity="center"        android:text="@string/vice_dispaly"        android:textSize="20sp">    </TextView>    <Button         android:layout_width="match_parent"        android:layout_height="60dp"        android:id="@+id/test"        android:text="@string/test"        />    </LinearLayout>
res-->values--->strings.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">双屏异显</string>    <string name="action_settings">设置</string>    <string name="open_vice_dispaly">开启副屏</string>    <string name="vice_dispaly">副屏</string>    <string name="test">同显</string>    <string name="vice_dispaly_next">副屏ing</string>    <string name="return1">返回</string>    <string name="close_vice_dispaly">退出副屏</string></resources>


学习过程中 的小技巧:

1、如上面ViceDisplayPresentation extends Presentation,此时要想用Presentation类中的方法时,可以这样调出来:

在代码Presentation类名上---->右击------->source--------->Override/Implement Methods------->可以勾选想要实现的方法。

2、在布局副屏界面想为某按钮添加android:onClick="事件方法名称",在ViceDisplay.java 中写该方法时,是不对的。因为其没有继承Activity,所以这种定义事件方法是不对的。
      应该定义监听器来完成事件的处理。代码如上。

疑问:

1、利用eclipse 与彩票终端机进行连接时,发现在代码运行过程中,DDMS,上的截图screen capture,只能截主屏的界面。不能截副屏的界面吗?

主屏截屏如下:


0 0
原创粉丝点击