在各種產品腦洞大開的時代,需求也是日益新異,筆者最近開發了一套雙屏異顯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();
所需權限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.TYPE_APPLICATION_OVERLAY" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
注:以上是以 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的開發進度與作業
有緣留個關注把
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/237102.html
標籤:其他
上一篇:connect to maven.google.com:443 connect timed out 連接不上的解決辦法
