Android Presentation雙屏異顯開發(fā)流程詳細講解
1. 背景
我們那個副屏是一塊汽車的后視鏡(流媒體后視鏡),是一塊長條塊的屏幕,分辨率是400 * 1920 px
,如何將需要顯示的內(nèi)容正確擺放地顯示到這塊屏幕上,也是我們開發(fā)中的一個重點。
并且,我們是使用平板橫屏進行開發(fā)的,對于橫屏情況下雙屏異顯的處理,也是我們開發(fā)中的一個重點。
2. 創(chuàng)建主屏布局
主屏就用MainActivity
就好
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //... } }
3. 創(chuàng)建副屏布局
這里,繼承了MyPresentation
接口
class MyPresentation(outerContext: Context, display: Display) : Presentation(outerContext, display) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.dialog_normal)//綁定副屏顯示的布局 } //顯示時調(diào)用 override fun onStart() { super.onStart() } //消失時調(diào)用 override fun onStop() { super.onStop() } }
4. 將頁面投屏到副屏上
投屏到副屏上有多中方式,我們只需要在MainActivity
中去調(diào)用這些代碼就可以了。
4.1 MediaRouter
MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO); if (route != null) { Display presentationDisplay = route.getPresentationDisplay(); if (presentationDisplay != null) { MyPresentation myPresentation = new MyPresentation(MainActivity.this, presentationDisplay); myPresentation.show(); } }
4.2 DisplayManager
DisplayManager mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = mDisplayManager.getDisplays(); if (displays.length > 1) { //displays[0] 主屏,displays[1] 副屏 MyPresentation myPresentation = new MyPresentation(MainActivity.this, displays[1]); myPresentation.show(); }
5. 橫屏狀態(tài)下雙屏異顯的處理
在我們那個副屏上,副屏的顯示邏輯是,主屏是豎屏,副屏就以副屏顯示,主屏是橫屏,副屏就以橫屏顯示。
如下圖所示
而我們想要達到的效果是,主屏是橫屏,而主屏是豎屏。
后來,我們想到了一個辦法,就是搞兩個Activity
,Activity1
負責顯示主屏的頁面,而Activity2
負責副屏的顯示。
首先啟動Activity2
,然后迅速啟動Activity1
,當Activity1
關(guān)閉的時候,也去關(guān)閉Activity1
,這樣就可以實現(xiàn)主屏和副屏方向顯示不一樣的情況了。
6. 將需要顯示的內(nèi)容正確擺放到副屏上
由于我們的副屏是一塊長條塊的屏幕,分辨率是400 * 1920 px
,我們現(xiàn)在主屏上是橫屏顯示,而副屏通過上述的操作,顯示的是豎屏。
而我們真正期望顯示的內(nèi)容是藍色這部分
所以,我們需要對View做一下旋轉(zhuǎn)并位移
val rotation: ObjectAnimator = ObjectAnimator.ofFloat(binding.textureView, "rotation", 0f, 90f) val translationX: ObjectAnimator = ObjectAnimator.ofFloat(binding.textureView, "translationX", 0f, -720F) val translationY: ObjectAnimator = ObjectAnimator.ofFloat(binding.textureView, "translationY", 0f, 420F) val animatorSet = AnimatorSet() animatorSet.playSequentially(rotation, translationX, translationY) animatorSet.duration = 0 animatorSet.start()
最終顯示為這樣
7. 其他
沒有副屏的情況下,如何調(diào)試 ?
如果手頭上沒有副屏,可以在開發(fā)者選項中,打開模擬輔助顯示設(shè)備
這里我們可以選擇1080P
顯示出來的虛擬副屏如下所示
這樣,我們就可以通過虛擬的副屏進行調(diào)試了。
參考
感謝
Android Presentation實現(xiàn)雙屏異顯
到此這篇關(guān)于Android Presentation雙屏異顯開發(fā)流程詳細講解的文章就介紹到這了,更多相關(guān)Android Presentation內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Android Studio4.1沒有Gsonfomat插件,Plugin “GsonFormat” is inco
這篇文章主要介紹了解決Android Studio4.1沒有Gsonfomat插件,Plugin “GsonFormat” is incompatible (supported only in IntelliJ IDEA)的問題 ,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-12-12Android 架構(gòu)之數(shù)據(jù)庫框架升級
上一篇講解了# Android 架構(gòu)之數(shù)據(jù)框架搭建 ,里面含有數(shù)據(jù)庫最基礎(chǔ)的增刪改查功能,不過只考慮了單數(shù)據(jù)庫,開發(fā)者可以舉一反三按照對應思路設(shè)計多數(shù)據(jù)庫架構(gòu)。 在本篇里,將會講解令開發(fā)者比較頭疼的數(shù)據(jù)庫升級,需要的朋友可以參考下面文章內(nèi)容2021-09-09Android水波紋載入控件CircleWaterWaveView使用詳解
這篇文章主要為大家詳細介紹了Android水波紋載入控件CircleWaterWaveView使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01